2015-10-31 105 views
0

我正在解析二进制数据中使用Shift-JIS编码字符串解析文件。我当前的代码是这样的:将拉丁字符从Shift JIS转换为Unicode中的拉丁字符

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

我不知道这是否是我的编码逻辑,或者我应该显示的字符串方式的问题(我就是直接将它们传递到我的控制)。任何帮助,将不胜感激!

回答

0

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

Unicode会喜欢这样的奇怪字符,它们只是语义上相同的现有字符的风格变体,不存在。但是它必须包括它们来回溯传统编码,如Shift-JIS。出于这个原因,他们被称为兼容性字符。

通过使用Unicode规范化和'K'格式(如NFKC),可以将兼容性字符转换为其基本变体。在Win32中,您可以使用NormalizeString()来完成此操作。

+0

[.NET显然有这个可用](https://msdn.microsoft.com/en-us/library/ebza6ck1.aspx),所以我最终使用'String.Normalize()'。 – InstilledBee