Unicode字符串

时间:2016-04-20 09:54:52

标签: c++ unicode

我想了解常规std::stringstd::map操作如何处理字符串中的Unicode代码单元。

示例代码:

    include <iostream>
    #include "sys/types.h"

    using namespace std;

    int main()
    {

        std::basic_string<u_int16_t> ustr1(std::basic_string<u_int16_t>((u_int16_t*)"ยฤขฃ", 4));
        std::basic_string<u_int16_t> ustr2(std::basic_string<u_int16_t>((u_int16_t*)"abcd", 4));

        for (int i = 0; i < ustr1.length(); i++)
            cout << "Char: " << ustr1[i] << endl;

        for (int i = 0; i < ustr2.length(); i++)
            cout << "Char: " << ustr2[i] << endl;

        if (ustr1 == ustr2)
            cout << "Strings are equal" << endl;

        cout << "string length: " << ustr1.length() << "\t" << ustr2.length() << endl;
        return 0;
    }

字符串包含泰语字符和ascii字符,使用basic_string<u_int16_t>背后的意图是便于存储无法容纳在单个字节内的字符。代码在Linux机器上运行,其编码类型为en_US.UTF-8。输出是:

$ ./a.out
Char: 47328
Char: 57506
Char: 42168
Char: 47328
Char: 25185
Char: 25699
Char: 17152
Char: 24936
string length: 4        4

几个问题:

  1. 输出中的字符值是否与en_US.UTF-8代码点对应?如果没有,他们是什么?

  2. std::string==!=<运营商是否能够使用Unicode代码点?如果是这样,它只是比较相应位置的每个代码点吗? std::map会在类似的行上工作吗?

  3. 将语言环境更改为UTF-16会导致字符串存储为UTF-16代码点吗?

  4. 谢谢!

1 个答案:

答案 0 :(得分:7)

  

我想了解常规std::stringstd::map操作如何处理字符串中的Unicode代码单元。

他们没有。

std::stringchar s或字节的序列。它不是一个高级别的&#34;将任何编码考虑在内的字符串。你必须自己这样做,例如通过使用专用于此目的的图书馆,如ICU。

std::string(即std::basic_string<char>)切换到std::basic_char<u_int16_t>并不会改变这种情况;它只是意味着你有一系列广泛的&#34;而不是字符。

std::map与此无关。

进一步阅读: