gpt4 book ai didi

c++ - UNICODE、UTF-8 和 Windows 困惑

转载 作者:可可西里 更新时间:2023-11-01 12:40:46 25 4
gpt4 key购买 nike

我正在尝试在 Windows 中实现文本支持,并打算稍后迁移到 Linux 平台。以统一的方式支持国际语言是最理想的,但考虑到所讨论的两个平台,这似乎并不容易实现。我花了相当多的时间阅读 UNICODE、UTF-8(和其他编码)、widechars 等,这是我到目前为止所了解的内容:

作为标准,UNICODE 描述了可映射的字符集及其出现的顺序。我将其称为“什么”:UNICODE 指定什么可用。

UTF-8(和其他编码)指定如何:每个字符如何以二进制格式表示。

现在,在windows上,他们本来选择了UCS-2编码,但是不能满足要求,所以他们有UTF-16,必要时也是多字符。

所以这里是困境:

  1. Windows 内部只支持 UTF-16,所以如果你想支持国际字符,你必须转换成它们的 widechar 版本以相应地使用操作系统调用。似乎不支持使用多字节 UTF-8 字符串调用 CreateFileA() 之类的东西,并让它看起来正确。这是正确的吗?
  2. 在 C 中,有一些支持多字节的函数(_mbscat、_mbscpy 等),但是在 Windows 上,这些函数的字符类型被定义为 unsigned char*。鉴于 _mbs 系列函数不是一个完整的集合(例如,没有 _mbstol 可以将多字节字符串转换为长字符串),您被迫使用一些 char* 版本的运行时函数,由于这些函数之间的有符号/无符号类型差异,这会导致编译器问题。有没有人甚至使用那些?你只是做一大堆类型转换来避免错误吗?
  3. 在 C++ 中,std::string 有迭代器,但这些迭代器基于 char_type,而不是代码点。因此,如果我在 std::string::iterator 上执行++,我会得到下一个 char_type,而不是下一个代码点。同样,如果您调用 std::string::operator[],您将获得对 char_type 的引用,它很可能不是一个完整的代码点。那么如何通过代码点迭代 std::string 呢? (C 具有 _mbsinc() 函数)。

最佳答案

只做UTF-8

每个平台都有很多UTF-8的支持库,也有一些是多平台的。正如您已经注意到的那样,Win32 中的 UTF-16 API 是有限且不一致的,因此最好将所有内容都保留为 UTF-8 并在最后一刻转换为 UTF-16。 Windows API 也有一些方便的 UTF-8 包装。

此外,在应用程序级文档中,UTF-8 越来越被接受为标准。每个文本处理应用程序要么接受 UTF-8,要么在最坏的情况下将其显示为“带有一些 dingbats 的 ASCII”,而只有少数应用程序支持 UTF-16 文档,而那些不支持的应用程序将其显示为“很多很多”的空白!”

关于c++ - UNICODE、UTF-8 和 Windows 困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13090175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com