处理多字节字符串

Posted

技术标签:

【中文标题】处理多字节字符串【英文标题】:Manipulating strings of multibyte characters 【发布时间】:2014-01-16 07:38:22 【问题描述】:

我是一名新手 C 程序员。我正在尝试编写一个 C 程序,它有时处理英文文本(适合 8 位字符),有时处理日文文本(需要 16 位)。

如果我使用相同的代码来操作任一国家/地区的文本,是否需要为每个字符(甚至是英文文本)留出 16 位?

多字节字符的编码方式有哪些?

如果编译器不能紧凑地存储多字节字符串怎么办?

我很困惑。请帮帮我。请用代码示例支持您的答案。另外,请解释一下 C++ 的上下文,因为我也在学习 C++ 并且也有这门语言的初学者级经验。

提前致谢。

这是几天前向我的一位熟人提出的面试问题。

【问题讨论】:

您使用的是哪个 SDK? UTF-8 是要走的路。 @JimBalter:绝对用于输入和输出。对于中间处理,肯定全16位更方便吗?使用 UTF8 使所有基本的字符串处理方式变得更加复杂。 @Jongware 如果你能 100% 保证 16 位对你来说总是足够的,可能。但是,如果您的文本可能(现在或将来)包含代理对(两个连续的 16 位字符组成一个代码点),则最好使用 UTF-8,因为 1.您只会在需要时支付存储费用,2. 无论如何,您都必须处理多字符编码,以及 3. 相当多的第 3 方 16 位例程无法正确处理代理对,而 multichar 通常在 UTF-8 处理中实现更好。 当我们分享链接时,另一个相关阅读:UTF-8 everywhere。 【参考方案1】:

在 C++ 中,您可以使用std::wstring,它使用wchar_t 作为底层char 类型。在 C++11 中,您还可以使用 std::u16stringstd::u32string,具体取决于所需字符的存储量。

C 在<wchar.h> 中也定义了wchar_t

【讨论】:

【参考方案2】:

好的,经过一番研究,我想我得到了答案:

mbstowcs(“多字节字符串到宽字符串”)和 wcstombs(“宽字符串到多字节字符串”)在 wchar_t 数组(其中每个字符占用 16 位,或两个字节)和多字节字符串(其中如果可能,单个字符存储在一个字节中)。

【讨论】:

以上是关于处理多字节字符串的主要内容,如果未能解决你的问题,请参考以下文章

处理多字节字符串

Go语言中多字节字符的处理

Go语言中多字节字符的处理

计算多字节字符的数量

如何将2W多字节的数据存入mysql中

Oracle全角和半角处理函数