首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#:在shift-JIS中转换日语文本编码,并以ASCII码存储为UTF8

C#:在shift-JIS中转换日语文本编码,并以ASCII码存储为UTF8
EN

Stack Overflow用户
提问于 2013-11-12 09:47:54
回答 3查看 14.5K关注 0票数 6

我正在尝试转换一个旧的应用程序,它有一些字符串存储在数据库中作为ASCII。

例如,字符串:ƒ`ƒƒƒlƒ<ƒp[ƒgƒi[,µ‘i’For ]存储在数据库中。

现在,如果我在文本编辑器中复制该字符串并将其另存为ASCII码,然后在web浏览器中打开该文件并将其设置为自动检测编码,我将获得日语中的正确字符串:チャネルパートナーの選択,并且页面显示检测到的编码是日语(ASCII码)。

当我尝试在C#代码中进行转换时,执行如下操作:

代码语言:javascript
复制
var asciiBytes = Encoding.ASCII.GetBytes(text);
var japaneseEncoding = Encoding.GetEncoding(932);
var convertedBytes = Encoding.Convert(japaneseEncoding, Encoding.ASCII, asciiBytes);
var japaneseString = japaneseEncoding.GetString(convertedBytes);

我得到?‘??l?p?[?g?i?[?i?作为日语字符串,因此我不能在网页上显示它。

任何光线都会很受欢迎。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-12 10:31:18

一些字符串存储在数据库中作为ASCII码

它不是ASCII码,因为ƒ`ƒƒƒlƒ<ƒp[ƒgƒi[,u‘i’]中的任何字符都不是ASCII码。Encoding.ASCII.GetBytes(文本)会产生很多吗?字符,这就是为什么你有那么多问号。

核心问题是使用错误的编码读取dbase列中的字节。您使用了代码页1252:

代码语言:javascript
复制
var badstringFromDatabase = "ƒ`ƒƒƒlƒ‹ƒp[ƒgƒi[‚Ì‘I‘ð";
var hopefullyRecovered = Encoding.GetEncoding(1252).GetBytes(badstringFromDatabase);
var oughtToBeJapanese = Encoding.GetEncoding(932).GetString(hopefullyRecovered);

它会产生"チャネルパートナーの選択“

这不是完全可靠的,代码页1252有一些在932中使用的未分配代码。您将得到一个乱码字符串,您不能再从中恢复原始的字节值。您需要专注于让数据提供程序使用正确的编码。

票数 10
EN

Stack Overflow用户

发布于 2013-11-12 10:43:44

根据另一个答案,我非常确定您使用的是ANSI/Default编码,而不是ASCII。

下面的例子似乎能帮你找到想要的东西。

代码语言:javascript
复制
var japaneseEncoding = Encoding.GetEncoding(932);

// From file bytes
var fileBytes = File.ReadAllBytes(@"C:\temp\test.html");
var japaneseTextFromFile = japaneseEncoding.GetString(fileBytes);
japaneseTextFromFile.Dump();

// From string bytes
var textString = "ƒ`ƒƒƒlƒ‹ƒp[ƒgƒi[‚Ì‘I‘ð";
var textBytes = Encoding.Default.GetBytes(textString);
var japaneseTextFromString = japaneseEncoding.GetString(textBytes);
japaneseTextFromString.Dump();

有趣的是,我认为我需要研究一下Encoding.Convert,因为它没有产生我期望的行为。似乎只有当我传入以Encoding.Default格式读取的字节时,GetString方法才能工作-如果我事先转换成日文编码,它们就不能像预期的那样工作。

票数 3
EN

Stack Overflow用户

发布于 2020-03-14 03:35:15

这段代码将输出一堆不同的选项,这样您就可以看到哪些选项是接近的。在没有任何编码意识的旧应用程序中,我经常使用它来做注释。

您可以在此处复制-粘贴以在线运行它:https://docs.microsoft.com/en-us/dotnet/api/system.text.encoding.getencodings?view=netframework-4.8#System_Text_Encoding_GetEncodings

代码语言:javascript
复制
using System;

public class Program
{
    public static void Main()
    {
        var badstringFromDatabase = "ƒ`ƒƒƒlƒ‹ƒp[ƒgƒi[‚Ì‘I‘ð";
        var recovered1 = System.Text.Encoding.GetEncoding(932).GetBytes(badstringFromDatabase); //Shift JIS
        var recovered2 = System.Text.Encoding.GetEncoding(20932).GetBytes(badstringFromDatabase); //EUC
        var recovered3 = System.Text.Encoding.GetEncoding(51932).GetBytes(badstringFromDatabase); //EUC
        var recovered4 = System.Text.Encoding.GetEncoding(50220).GetBytes(badstringFromDatabase); //ISO-2022-JP
        var recovered5 = System.Text.Encoding.GetEncoding(50221).GetBytes(badstringFromDatabase); //ISO-2022-JP
        var recovered6 = System.Text.Encoding.GetEncoding(50222).GetBytes(badstringFromDatabase); //ISO-2022-JP
        var recovered7 = System.Text.Encoding.GetEncoding(65001).GetBytes(badstringFromDatabase); //UTF-8
        var recovered8 = System.Text.Encoding.GetEncoding(1200).GetBytes(badstringFromDatabase); //UTF-16
        var recovered9 = System.Text.Encoding.GetEncoding(12000).GetBytes(badstringFromDatabase); //UTF-32
        var recovered10 = System.Text.Encoding.GetEncoding(12001).GetBytes(badstringFromDatabase); //UTF-32BE
        var recovered11 = System.Text.Encoding.GetEncoding(65000).GetBytes(badstringFromDatabase); //UTF-7
        Console.WriteLine("Shift JIS: " + System.Text.Encoding.GetEncoding(932).GetString(recovered1)); //Shift JIS
        Console.WriteLine("EUC: " + System.Text.Encoding.GetEncoding(932).GetString(recovered2)); //EUC
        Console.WriteLine("EUC: " + System.Text.Encoding.GetEncoding(932).GetString(recovered3)); //EUC
        Console.WriteLine("ISO-2022-JP: " + System.Text.Encoding.GetEncoding(932).GetString(recovered4)); //ISO-2022-JP
        Console.WriteLine("ISO-2022-JP: " + System.Text.Encoding.GetEncoding(932).GetString(recovered5)); //ISO-2022-JP
        Console.WriteLine("ISO-2022-JP: " + System.Text.Encoding.GetEncoding(932).GetString(recovered6)); //ISO-2022-JP
        Console.WriteLine("UTF-8: " + System.Text.Encoding.GetEncoding(932).GetString(recovered7)); //UTF-8
        Console.WriteLine("UTF-16: " + System.Text.Encoding.GetEncoding(932).GetString(recovered8)); //UTF-16
        Console.WriteLine("UTF-32: " + System.Text.Encoding.GetEncoding(932).GetString(recovered9)); //UTF-32
        Console.WriteLine("UTF-32BE: " + System.Text.Encoding.GetEncoding(932).GetString(recovered10)); //UTF-32BE
        Console.WriteLine("UTF-7: " + System.Text.Encoding.GetEncoding(932).GetString(recovered11)); //UTF-7
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19919439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档