在 C++ 中获取 unicode 字符的 CodePoint

Posted

技术标签:

【中文标题】在 C++ 中获取 unicode 字符的 CodePoint【英文标题】:Get CodePoint of unicode Character in C++ 【发布时间】: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;

有什么建议吗? :)

【问题讨论】:

见***.com/questions/2996667/… 谢谢,但我不想使用图书馆 在这种情况下,你可以使用这个:tools.ietf.org/html/rfc3629 【参考方案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 的答案。

以上是关于在 C++ 中获取 unicode 字符的 CodePoint的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的 Unicode 字符串索引

在 C++ 中解释转义的 unicode 字符

纯 C++ 中的 Unicode 字符串

在 C++ 源代码中使用 Unicode

如何在 python 包装中使用 unicode 字符串用于带有 cython 的 c++ 类?

C++ 中的 Unicode 字符串处理