当前位置:  开发笔记 > 编程语言 > 正文

如何输入4字节的UTF-8字符?

如何解决《如何输入4字节的UTF-8字符?》经验,为你挑选了1个好方法。

我正在编写一个小应用程序,我需要使用不同字节长度的utf-8字符进行测试.

我可以输入unicode字符进行测试,用utf-8编码1,2,3个字节就好了,例如:

string in = "pi = \u3a0";

但是如何获得用4字节编码的unicode字符?我试过了:

string in = "aegan check mark = \u10102";

据我所知,应该输出.但是当我打印出来时,我得到了ᴶ0

我错过了什么?

编辑:

我通过添加前导零来实现它:

string in = "\U00010102";

希望我早点想到这个:)



1> gz...:

模式中有一个较长的逃逸形式,\U后跟八位数,而不是\u四位数.这也用于Java和Python,其中包括:

>>> '\xf0\x90\x84\x82'.decode("UTF-8")
u'\U00010102'

但是,如果您使用字节字符串,为什么不像上面那样转义每个字节,而不是依靠编译器将转换转换为UTF-8字符串?这似乎也更便携 - 如果我编译以下程序:

#include 
#include 

int main()
{
    std::cout << "narrow: " << std::string("\uFF0E").length() <<
        " utf8: " << std::string("\xEF\xBC\x8E").length() <<
        " wide: " << std::wstring(L"\uFF0E").length() << std::endl;

    std::cout << "narrow: " << std::string("\U00010102").length() <<
        " utf8: " << std::string("\xF0\x90\x84\x82").length() <<
        " wide: " << std::wstring(L"\U00010102").length() << std::endl;
}

在我的当前选项cl的win32上给出:

warning C4566: character represented by universal-character-name '\UD800DD02' cannot be represented in the current code page (932)

编译器尝试将字节字符串中的所有unicode转义转换为系统代码页,与UTF-8不同,它不能代表所有unicode字符.奇怪的是,它已经理解\U00010102\uD800\uDD02UTF-16(其内部unicode表示)并在错误消息中损坏了转义...

运行时,程序打印:

narrow: 2 utf8: 3 wide: 1
narrow: 2 utf8: 4 wide: 2

请注意,UTF-8字节串和宽字符串是正确的,但编译器无法转换"\U00010102",给出字节字符串"??",结果不正确.

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有