>我有一个非常大(数百万行(的应用程序,它是使用 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_utf8
或std::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
里面你可以清楚地看到它:从0x00
到0xFF
:每个符号一个字节(2 * 4位(,256个符号。
关于国际化,Microsoft有帮助?