0

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

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

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

4

2 回答 2

1

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

Windows 上的 UTF-8 支持似乎正在改进。最新的 Windows 10SR4 中甚至还有一个".utf8"或语言环境。".utf-8"如果它们必须在旧版本上运行,您可能仍然无法在很长一段时间内在您的应用程序中使用 UTF-8 语言环境。

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

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

于 2018-05-20T03:29:48.173 回答
0

Oracle 提供了一个非常详细的页面来讨论该主题。(搜索:CP1252在页面底部,所有“字符集”都列在了底部。)

MBCS代表:多字节字符集。

cp-1252 is not 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_to\Python27\Lib\encodings\cp1252.py您可以清楚地看到它:从0x000xFF:每个符号一个单字节(2 * 4 位),256 个符号。

关于国际化,微软有帮助吗?

于 2018-05-19T22:44:35.380 回答