【问题标题】:Get CodePoint of unicode Character in C++在 C++ 中获取 unicode 字符的 CodePoint
【发布时间】:2014-08-08 10:35:13
【问题描述】:

我想获取此字符串“عربى”中每个字符的代码点 所以我写了这段代码,但它总是输出 63,这是问号字符“?”的代码点

TCHAR   myString[50] = _T("عربى");
int stringLength=_tcslen(_T(myString));

for(int i=0;i<stringLength;i++)
{
   unsigned int number =myString[i];
   cout<<number<<endl;
}

有什么建议吗? :)

【问题讨论】:

标签: c++ string unicode


【解决方案1】:

这里的代码仅使用标准库并按 32 位宽的代码单元迭代字符串。在最新的 UTF-32 中,这与代码点匹配。

using namespace std;
const auto str = u8"عربى";
wstring_convert<codecvt_utf8<char32_t>, char32_t> cv;
auto str32 = cv.from_bytes(str);
for(auto c : str32)
    cout << uint_least32_t(c) << '\n';

如果您的标准库尚未实现这些功能,您可能应该使用外部库。

【讨论】:

    【解决方案2】:

    我复制了您的代码,并通过将_T(myString) 转换为简单的myString,它起作用了。这是完整的程序。

    #include <afxwin.h>
    
    #include <iostream>
    
    int main() {
        using namespace std;
    
        TCHAR   myString[50] = _T("عربى");
        int stringLength = _tcslen(myString); // <----- edit here
    
        for(int i=0;i<stringLength;i++)
        {
           unsigned int number =myString[i];
           cout<<number<<endl;
        }
    }
    

    输出:

    1593
    1585
    1576
    1609
    

    【讨论】:

    • 这可能不适用于包含 utf-8 中超过 2 个代码单元的代码点。再说一遍,OP 可能不需要那些脚本。
    • @Nasser :非常感谢您的帮助 :) user2079303 :您能否举个例子,因为我不明白您的意思,感谢您的大力帮助 :)
    • @RehabReda:据我了解,TCHAR 是 16 位宽(如果启用了 unicode)。一个 32 位宽的代码点将由 UTF-16 中的 2 个代码单元表示。此代码仍按(16 位宽)代码单元而不是代码点迭代字符串。例如这个字符:? (isthisthingon.org/unicode/…),代码将打印 55296 57090 而不是 66306。(至少我是这么认为的,代码在我的编译器中无法编译)。我添加了一个适用于所有当前 unicode 但需要 c++11 的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多