将Shift JIS中的拉丁字符转换为Unicode

时间:2015-10-31 17:35:05

标签: c# .net unicode encoding

我正在使用二进制数据中的Shift-JIS编码字符串解析文件。我目前的代码是:

public static string DecodeShiftJISString(this byte[] data, int index, int length)
{
    byte[] utf8Bytes = Encoding.Convert(Encoding.GetEncoding(932), Encoding.UTF8, data);
    return Encoding.UTF8.GetString(utf8Bytes);
}

它工作正常,我可以从这个方法获得可用的字符串,虽然当我在我的WinForms应用程序中显示带有拉丁字符的字符串时,我看到字符比正常情况更宽。

Latin characters in Shift-JIS string

我不确定这是我的编码逻辑的问题,还是我应该显示字符串的方式(我只是将它们直接传递给我的控件)。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

这些不是普通的ASCII字符,它们是U + FF01 fullwidth exclamation mark以上范围内的“全宽变体”。他们在设置拉丁和CJK字符的混合时排队格式化。

Unicode会更喜欢像这样的奇怪字符,这些字符只是语义相同的现有字符的样式变体,不存在。但它必须包括它们往返传统编码,如Shift-JIS。因此,它们被称为兼容性字符。

您可以使用带有'K'格式的Unicode规范化(例如NFKC)将兼容性字符转换为其基本变体。在Win32中,您可以使用NormalizeString()

执行此操作