服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 现代 C++ 中的基本字符串与 Unicode 字符串使用指南

现代 C++ 中的基本字符串与 Unicode 字符串使用指南

2023-12-12 14:00鲨鱼编程 C/C++

本文将探讨在现代 C++ 中如何处理基本字符串和 Unicode 字符串。我们将对比传统的 std::string 与新引入的 std::u16string 和 std::u32string,并通过实例展示其用法。

本文将探讨在现代 C++ 中如何处理基本字符串和 Unicode 字符串。我们将对比传统的 std::string 与新引入的 std::u16string 和 std::u32string,并通过实例展示其用法。

现代 C++ 中的基本字符串与 Unicode 字符串使用指南

一、基本字符串:std::string

在 C++ 中,最常用的字符串类型是 std::string。这是一个非常灵活且高效的类,用于处理基本的 ASCII 字符串。

#include < iostream>  
#include < string>  
  
int main() {  
    std::string str = "Hello, World!";  
    std::cout << str << std::endl; // 输出 "Hello, World!"  
    return 0;  
}

1.字符访问与修改

你可以像访问数组一样访问 std::string 中的字符:

char& ch = str[0]; // 获取第一个字符的引用  
ch = 'h'; // 修改第一个字符为小写 'h'  
std::cout << str << std::endl; // 输出 "hello, World!"

2.字符串连接

字符串连接在 C++ 中非常直观:

char& ch = str[0]; // 获取第一个字符的引用  
ch = 'h'; // 修改第一个字符为小写 'h'  
std::cout << str << std::endl; // 输出 "hello, World!"

二、Unicode 字符串:std::u16string 和 std::u32string

处理包含非 ASCII 字符的字符串时,需要使用 Unicode。C++11 引入了 std::u16string 和 std::u32string 分别表示 UTF-16 和 UTF-32 编码的字符串。

1.UTF-16 示例:std::u16string

UTF-16 是一个变长编码,每个字符占用 2 或 4 个字节。在 C++ 中使用 std::u16string:

#include < iostream>  
#include < string>  
#include < locale>  
#include < codecvt>  
  
int main() {  
    std::wstring_convert< std::codecvt_utf8_utf16, char16_t> converter;  
    std::u16string utf16Str = converter.from_bytes("你好,世界!"); // 将 UTF-8 转换为 UTF-16  
    std::cout << converter.to_bytes(utf16Str) << std::endl; // 输出 "你好,世界!"  
    return 0;  
}

2.UTF-32 示例:std::u32string

UTF-32 是一个固定长度的编码,每个字符占用 4 个字节。在 C++ 中使用 std::u32string:

#include < iostream>  
#include < string>  
#include < locale>  
#include < codecvt>  
  
int main() {  
    std::wstring_convert< std::codecvt_utf8< char32_t>, char32_t> converter;  
    std::u32string utf32Str = converter.from_bytes("你好,世界!"); // 将 UTF-8 转换为 UTF-32  
    std::cout << converter.to_bytes(utf32Str) << std::endl; // 输出 "你好,世界!"  
    return 0;  
}

注意:从 C++17 开始,`< codecvt>` 头文件已被标记为废弃,并在后续标准中被移除。在实际开发中,建议使用第三方库(如 ICU)进行字符集转换。`  

三、字符串处理函数与算法  

C++ 标准库提供了大量用于操作和处理字符串的函数和算法,如 `std::strlen`、`std::strcpy`、`std::strcat` 等。这些函数通常与 C 风格字符串(以 null 结尾的字符数组)一起使用。然而,当处理 Unicode 字符串时,使用这些函数可能会导致问题,因为它们通常不理解多字节字符编码。在这种情况下,建议使用 C++ 标准库中的算法,如 `std::copy`、`std::find` 等,它们与 `std::string`、`std::u16string` 和 `std::u32string` 兼容。

四、总结与建议

本文探讨了在现代 C++ 中使用基本字符串和 Unicode 字符串的方法。对于 ASCII 字符串,`std::string` 是一个高效且易于使用的类。当需要处理包含非 ASCII 字符的字符串时,可以选择 UTF-8、UTF-16 或 UTF-32 编码,并使用相应的 `std::string`、`std::u16string` 或 `std::u32string` 类。注意避免使用已废弃的 `< codecvt>` 头文件,考虑使用第三方库如 ICU 进行字符集转换。在处理 Unicode 字符串时,尽量使用 C++ 标准库中的算法,而不是针对 C 风格字符串的函数。

原文地址:https://mp.weixin.qq.com/s?__biz=Mzg4Mjg0MTA3Ng==&mid=2247487082&idx=1&sn=cc15468ced4dcc5abc9a9963db0481e1

延伸 · 阅读

精彩推荐
  • C/C++C语言字符串大小比较

    C语言字符串大小比较

    本文给大家分享给大家的是C语言的字符串大小比较的函数,有需要的小伙伴可以参考下。...

    C语言教程网10712021-03-04
  • C/C++C++ STL标准库std::vector的使用详解

    C++ STL标准库std::vector的使用详解

    vector 是表示可以改变大小的数组的序列容器,本文主要介绍了C++ STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,...

    超级大洋葱8063922022-10-13
  • C/C++利用C语言实现猜数字小游戏

    利用C语言实现猜数字小游戏

    这篇文章主要为大家详细介绍了利用C语言实现猜数字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    IT技术博主-方兴未艾12472021-12-09
  • C/C++一篇文章带你实现C语言中常用库函数的模拟

    一篇文章带你实现C语言中常用库函数的模拟

    这篇文章主要介绍了C语言中常用库函数的模拟,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以...

    08-0811712022-01-11
  • C/C++MFC修改编辑框光标显示位置方法详解

    MFC修改编辑框光标显示位置方法详解

    这篇文章主要介绍了在MFC中利用CComboBox控件修改编辑框光标显示位置的两种解决方法,文中的示例代码讲解详细,感兴趣的可以了解一下...

    中国好公民st5682022-09-28
  • C/C++解析C++浮点数无效值的定义与无效值判定的小结

    解析C++浮点数无效值的定义与无效值判定的小结

    本篇文章是对C++中浮点数无效值的定义与无效值的判定进行了详细的分析介绍,需要的朋友参考下...

    C++教程网2722020-12-01
  • C/C++C++中对象的动态建立与释放详解及其作用介绍

    C++中对象的动态建立与释放详解及其作用介绍

    这篇文章主要介绍了C++中对象的动态建立与释放详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...

    我是小白呀10752021-12-30
  • C/C++C语言实现拼图游戏

    C语言实现拼图游戏

    这篇文章主要为大家详细介绍了C语言实现拼图游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    导航者-追梦5502021-08-25