【发布时间】:2018-10-12 21:07:03
【问题描述】:
我想使用 Visual Studio 2017、C++ 和 WindowsAPI(以前称为 Win32)为自己编写一个语言学习应用程序。操作系统是最新的 Windows 10 内部版本,向后兼容性不是问题。由于我假设英语是用户的母语,而我目前感兴趣的语言是另一种欧洲语言,ASCII 可能就足够了。但我想对它进行未来验证(更多异国情调的语言),我也想尝试使用 UTF-32。我以前使用过 UTF-8 和 UTF-16,但我对后者有更多的经验。
感谢std::basic_string,很容易弄清楚如何获取 UTF-32 字符串:
typedef std::basic_string<char32_t> stringUTF32
由于我为所有 GUI 人员使用 WinAPI,我需要在 UTF-32 和 UTF-16 之间进行一些转换。
现在我的问题是:由于 UTF-32 效率低下而没有被广泛使用,因此网络上几乎没有任何关于它的资料。为了避免不必要的转换,我想将我的词汇表和其他数据保存为 UTF-32(对于所有 UTF-8 倡导者/传播者,替代方案是 UTF-16)。问题是,我找不到如何用 UTF-32 编写和打开文件。
所以我的问题是:如何以 UTF-32 写入/打开文件?我希望不需要第三方库,除非它们是 Windows 的一部分或通常随该操作系统一起提供。
【问题讨论】:
-
"但我希望它能够适应未来(更多异国情调的语言),并且我也想尝试使用 UTF-32。“UTF-8 也不逊色”面向未来”而不是 UTF-32。这就是 UTF 格式的重点:它们都对完全相同的数据范围进行编码。
-
澄清一下,当您说“写入和打开”文件时,您是在暗指 iostream 样式的格式化 IO,还是仅使用原始数据?
-
@Willi 我问的原因是,归根结底,数据就是数据。除非您尝试使用 STL 的格式化 IO 功能,否则读取和写入文件与编码无关。
-
另外,你知道,即使在 UTF-32 中,如果你想正确地做事,许多基于文本的操作本质上仍然是多符号的,即使是像搜索字母这样简单的操作,因此相对于 UTF-8,您实际上并没有获得太多收益
-
UTF-8 非常适合用于磁盘存储、网络通信等。UTF-16 在内存使用和逻辑复杂性之间取得了很好的平衡,因为大多数语言不使用 BMP (东亚语言、表情符号等)。在处理 UTF 数据时,您通常必须以 UTF-32 进行处理以进行代码点比较,但您可以在每个代码点的基础上执行此操作而不会浪费内存。将 UTF-32 存储在磁盘上或在内存中使用 UTF-32 字符串几乎没有什么好处。另外,UTF-32 并不能解决“1 个代码点!= 1 个字素”问题——字素是用户倾向于认为的字符。
标签: c++ winapi unicode windows-10 utf-32