在 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的主要内容,如果未能解决你的问题,请参考以下文章