我正在尝试转换一个旧的应用程序,它有一些字符串存储在数据库中作为ASCII。
例如,字符串:ƒ`ƒƒƒlƒ<ƒp[ƒgƒi[,µ‘i’For ]存储在数据库中。
现在,如果我在文本编辑器中复制该字符串并将其另存为ASCII码,然后在web浏览器中打开该文件并将其设置为自动检测编码,我将获得日语中的正确字符串:チャネルパートナーの選択,并且页面显示检测到的编码是日语(ASCII码)。
当我尝试在C#代码中进行转换时,执行如下操作:
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?作为日语字符串,因此我不能在网页上显示它。
任何光线都会很受欢迎。
谢谢
发布于 2013-11-12 10:31:18
一些字符串存储在数据库中作为ASCII码
它不是ASCII码,因为ƒ`ƒƒƒlƒ<ƒp[ƒgƒi[,u‘i’]中的任何字符都不是ASCII码。Encoding.ASCII.GetBytes(文本)会产生很多吗?字符,这就是为什么你有那么多问号。
核心问题是使用错误的编码读取dbase列中的字节。您使用了代码页1252:
var badstringFromDatabase = "ƒ`ƒƒƒlƒ‹ƒp[ƒgƒi[‚Ì‘I‘ð";
var hopefullyRecovered = Encoding.GetEncoding(1252).GetBytes(badstringFromDatabase);
var oughtToBeJapanese = Encoding.GetEncoding(932).GetString(hopefullyRecovered);它会产生"チャネルパートナーの選択“
这不是完全可靠的,代码页1252有一些在932中使用的未分配代码。您将得到一个乱码字符串,您不能再从中恢复原始的字节值。您需要专注于让数据提供程序使用正确的编码。
发布于 2013-11-12 10:43:44
根据另一个答案,我非常确定您使用的是ANSI/Default编码,而不是ASCII。
下面的例子似乎能帮你找到想要的东西。
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方法才能工作-如果我事先转换成日文编码,它们就不能像预期的那样工作。
发布于 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
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
}
}https://stackoverflow.com/questions/19919439
复制相似问题