Microsoft如何处理UTF-16在其C++标准库实现中是可变长度编码的事实

Let*_*_Be 11 c++ utf-16

标准中间接禁止使用可变长度编码.

所以我有几个问题:

如何处理标准的以下部分?

17.3.2.1.3.3宽字符序列

宽字符序列是一个数组对象(8.3.4)A,可以声明为TA [N],其中T是wchar_t(3.9.1)类型,可选择由const或volatile的任意组合限定.数组的初始元素定义了内容,包括由某个谓词确定的元素.字符序列可以由指定其第一元素的指针值S指定.

NTWCS的长度是终止空宽字符之前的元素数.空NTWCS的长度为零.

问题:

basic_string<wchar_t>

  • 如何operator[]实施以及它返回了什么?
    • 标准: If pos < size(), returns data()[pos]. Otherwise, if pos == size(), the const version returns charT(). Otherwise, the behavior is undefined.
  • size()返回元素的数量还是字符串的长度?
    • 标准: Returns: a count of the number of char-like objects currently in the string.
  • resize()工作怎么样?
    • 与标准无关,它是做什么的
  • 如何在的位置insert(),erase()和其他处理?

cwctype

  • 几乎所有东西都在这里.如何处理变量编码?

cwchar

  • getwchar() 显然无法返回整个平台 - 角色,那么这是如何工作的?

加上所有其余的角色功能(主题是相同的).

编辑:我将打开奖金以获得一些确认.我希望得到一些明确的答案或至少更明确的投票分配.

编辑:这开始变得毫无意义.这充满了完全相互矛盾的答案.你们有些人谈论外部编码(我不关心那些,UTF-8编码仍然会被存储为UTF-16一旦读入字符串,输出相同),其余只是相互矛盾.: - /

MSa*_*ers 15

以下是Microsoft的STL实现如何处理可变长度编码:

basic_string<wchar_t>::operator[])( 可以单独返回低或高代理.

basic_string<wchar_t>::size()返回wchar_t对象的数量.代理对(一个Unicode字符)使用两个wchar_t,因此会增加两个大小.

basic_string<wchar_t>::resize() 可以截断代理对中间的字符串.

basic_string<wchar_t>::insert() 可以插入代理对的中间.

basic_string<wchar_t>::erase() 可以删除代理对的一半.

通常,模式应该是明确的:STL不假设a std::wstring是UTF-16,也不强制它仍然是UTF-16.

  • @Let_Me_Be:如果考虑Unicode中存在组合标记,您只能意识到整个Unicode实际上是一个可变长度编码.如果您的字符串包含Unicode代码点U + 0041 U + 0308(LATIN CAPITAL LETTER A和COMBINING DIARESIS)并且您尝试在它们之间插入代码点U + 0030(DIGIT ZERO),您会发生什么?Allog这些代码点可以用UTF-16和UCS-4中的单个元素表示. (3认同)
  • @Let_Me_Be:不,我在说*内部*编码.即使您的内部编码是UCS-4,由于Unicode中存在组合标记,它仍然是可变长度编码.在单个代码点中,没有办法对每个字符进行编码(因为非程序员会定义这样的事情). (2认同)

Cas*_*Cow 9

STL将字符串作为字符数组的包装器处理,因此STL字符串上的size()或length()将告诉您它包含多少个char或wchar_t元素,而不一定是字符串中可打印字符的数量.


Mic*_*urr 8

假设您正在讨论wstring类型,则不会处理编码 - 它只是在wchar_t不知道编码的情况下处理元素.这只是一系列wchar_t的.您需要使用其他功能的功能来处理编码问题.