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