c语言中长字符串用什么定义(C20新特性)

目前互联网应用中,例如大部分网站都已经使用 UTF-8 编码,而 C 标准库里面,例如filesystem库里面关于文件路径等,也是和 UTF-8 编码相关,因此 C 标准也要优化对 UTF-8 编码的支持,下面我们就来说一说关于c语言中长字符串用什么定义?我们一起去了解并探讨一下这个问题吧!

c语言中长字符串用什么定义(C20新特性)

c语言中长字符串用什么定义

新增 char8_t 类型表示 UTF-8 字符串

目前互联网应用中,例如大部分网站都已经使用 UTF-8 编码,而 C 标准库里面,例如filesystem库里面关于文件路径等,也是和 UTF-8 编码相关,因此 C 标准也要优化对 UTF-8 编码的支持。

虽然在 C 11 中,已经增加了 UTF-8 字符串常量(u8"\xe4\xb8\xad\xe6\x96\x87"),但一直是使用 char * 作为类型。这样导致的问题,就是一个 char * 类型变量,可能是 UTF-8 编码,也可能是多字节编码(例如 GBK),因此为了区分不同的编码类型,可能需要通过不同的函数名重载,或者模板 traits 等技巧来进行区分。

因此在 C 20 中,将 UTF-8 字符串作为一种单独的类型,增加了新的 char8_t 类型来进行描述。各种与字符串相关的模板都增加 char8_t 相关的特化,例如 std 的字符串包装类,就增加了 std::u8string 类型(std::basic_string<char8_t>)。

这个修改会造成不兼容,原来合法的代码,可能会变得不合法,原来为了处理 UTF-8 字符串而特化成 char * 类型的模板,需要改为特化 char8_t * 类型。

const auto * s1 = u8"text"; // <1> s1的类型,C 17 推导成const char *,C 20 推导成const char8_t * const char * s2 = u8"text"; // <2> C 17 正确,C 20 变成不正确 const char8_t * s3 = u8"text"; // <3> C 17 不正确(没有char8_t类型),C 20 正确 template<typename T> int is_char8( const T * ) { return 0; } template<> int is_char8<char>( const char * ) { return 1; } std::cout << is_char8( s3 ) << std::endl; // <4> C 17 输出1,C 20 输出0 template<typename T> int is_char8_new( const T * ) { return 0; } template<> int is_char8_new<char8_t>( const char8_t * ) { return 1; } // <5> C 17 不支持 std::cout << is_char8_new( s3 ) << std::endl; // <6> C 20 输出1 std::string s4 = u8"text"; // <7> C 17 正确,C 20 变成不正确 std::u8string s5 = u8"text"; // <8> C 17 不正确(没有std::u8string类型),C 20 正确 std::filesystem::path p1; std::string s6 = p1.u8string(); // <9> C 17 正确,C 20 变成不正确 std::u8string s7 = p1.u8string(); // <10> C 17 不正确(没有std::u8string类型),C 20 正确

明确 char16_t 和 char32_t 表示 UTF-16 和 UTF-32 字符串

之前的 C 标准新增 char16_t 和 char32_t 类型的时候,只是说他们应该使用 UTF-16 和 UTF-32 的编码格式,但标准里面没有明确进行这样要求。

因此在 C 20 中,新增的 char8_t 类型明确要求是 UTF-8 字符串,同时将原来的 char16_t 和 char32_t 类型,也改为明确要求是 UTF-16 和 UTF-32 字符串。

明确不在 ISO 10646(Unicode编码标准)中的字符的处理

之前的 C 标准,新增了字符串常量中的Unicode字符表达方式(\unnnn和\Unnnnnnnn),例如 \U0001f34 、 \uD83C\uDF4C 等,但对于不在 ISO 10646(Unicode编码标准)中的字符的处理,则没有明确说明。

因此在 C 20 中,明确要求Unicode字符表达方式(\unnnn和\Unnnnnnnn)中,如果有不在ISO 10646(Unicode编码标准)中的字符,那么这个代码是不合法的。

【往期回顾】

C 20 新特性(9):指针和数组相关的两个改进

C 20 新特性(8):range形式的for语句改进

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页