我正在尝试转换一个旧应用程序,该应用程序在数据库中将一些字符串存储为 ASCII。
例如字符串:ƒ`ƒƒƒlƒ‹ƒp[ƒgƒi[‚Ì‘I‘ð存储在数据库中。
现在,如果我在文本编辑器中复制该字符串并将其另存为 ASCII,然后在 Web 浏览器中打开该文件并将其设置为自动检测编码,我会得到正确的日文字符串:チュネルパートナーの选択,页面显示检测到的编码是日语 (Shift_JIS)。
当我尝试在 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??作为日文字符串,因此我无法在网页上显示它。
任何光将不胜感激。
谢谢
最佳答案
some strings stored in the database as ASCII
它不是 ASCII,关于 ƒ`ƒƒƒlƒ‹ƒp[ƒgƒi[‚Ì‘I‘ð 中的所有字符都不是 ASCII。 Encoding.ASCII.GetBytes(text) 会产生很多吧?字符,这就是为什么你有所有这些问号。
核心问题是 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。您最终会得到一个乱码字符串,您无法再从中恢复原始字节值。您需要专注于让数据提供者使用正确的编码。
关于C#:将 shift-JIS 中的日文文本编码并存储为 ASCII 转换为 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19919439/