【问题标题】:Convert Latin characters from Shift JIS to Latin characters in Unicode将 Shift JIS 中的拉丁字符转换为 Unicode 中的拉丁字符
【发布时间】:2025-12-05 05:40:02
【问题描述】:

我正在使用二进制数据中的 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

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

【问题讨论】:

    标签: c# .net unicode encoding


    【解决方案1】:

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

    Unicode 更喜欢像这样的奇怪字符,它们只是现有字符的语义相同的风格变体,不存在。但它必须包含它们才能往返于 Shift-JIS 等传统编码。因此,它们被称为兼容字符。

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

    【讨论】: