从 Windows MBCS 转换为 UTF-8



>我有一个非常大(数百万行(的应用程序,它是使用 MBCS(代码页 1252(开发的,并假设所有字符串都是 char*,每个字符只有一个字节。我们现在正在扩展我们的语言集,需要迁移到Unicode。由于 UTF-8 以 1 字节为增量工作,因此这似乎很合适。按照惯例,我们希望以最少的代码更改进行此更改。我们不想将所有内容更改为 wchar 或 _TCHAR,并且必须修改每个源文件的编码方式,如果我们能提供帮助的话。

使用这些外来字符的唯一方法是用户在字段(如名称(中输入它们。然后,包含这些字符的字符串将根据需要保存到文件中,并且不会作。稍后将读取文件并显示内容。假设源代码中没有使用 cp1252 以外的字符(即中文字符等(,我们是否需要对大部分源代码进行任何更改,或者我们可以将其保留为 char* 并让可能的多字节字符通过系统,直到它们到达显示它们的 UI?

该应用程序是使用 MFC 在 Visual Studio 2015 上开发的。

UTF-8 是用于对数据进行编码的不错选择。 Windows上对它的支持越来越好,但您仍然希望将UTF-8字符串与wchar_t字符串(即Windows上的UTF-16(相互转换,以便将它们与Windows API一起使用。 (Windows 对使用 CP 65001 的控制台读取和写入 UTF-8 的支持有限,但你的应用可能不是控制台模式。您可以使用 Boost、Cmbstowcs()或 中的<codecvt>(std::codecvt_utf8std::codecvt_utf8_utf16(、widen()narrow()或各种其他库(如 ICU 或 QT(来执行此操作。

Windows上的UTF-8支持似乎正在改善。 在最新的Windows 10SR4中甚至有一个".utf8"".utf-8"区域设置。如果应用必须在旧版本上运行,则在很长一段时间内,您仍然可能无法在应用中使用 UTF-8 区域设置。

您还需要能够将旧数据转换为 UTF-8,但相同的库也可以处理这个问题。 例如,可以从初始化为保存数据的代码页的std::locale对象中获取codecvt分面。 或者只使用查找表。

除了UTF-8 之外,没有太多理由将数据保存。 UTF-16 占用更多空间,它甚至不是固定宽度的编码,字节序有问题,并且在其他地方没有广泛使用。

Oracle 提供了一个非常详细的页面来讨论这个话题。(搜索:CP1252页面上,所有"字符集"都列在底部。

MBCS代表:多字节字符集。

cp-1252不是MBCS
cp-1252包含ASCII char-set(128个符号(,扩展了128个符号:256个符号,每个符号编码1个字节。

由于MBCS每个符号可以容纳 1 或 2 个字节,因此它包括cp-1252(256 个 1 字节符号(,但它包含的符号比cp-1252多得多。
请参阅Microsoft,关于 Unicode 和 MBCS。

如果你安装了python,在文件your_path_toPython27Libencodingscp1252.py里面你可以清楚地看到它:从0x000xFF:每个符号一个字节(2 * 4位(,256个符号。

关于国际化,Microsoft有帮助?

相关内容

  • 没有找到相关文章

最新更新