gpt4 book ai didi

c++ - C++ 中的 Utf-8 : quick & dirty tricks

转载 作者:可可西里 更新时间:2023-11-01 15:23:49 27 4
gpt4 key购买 nike

我知道有很多关于 utf-8 的问题,主要是关于像对象一样操作 utf-8“字符串”的库。

但是,我正在做一个“国际化”项目(一个网站,我在其中编写了一个 C++ 后端代码……别问了),即使我们处理 utf-8,我们实际上也不需要这样的库.大多数时候,普通的 std::string 方法或 STL 算法就足以满足我们的需求,这确实是我们首先使用 utf-8 的目标。

因此,我在这里寻找的是您所知道的与存储为 std::string(无 const char*,我真的不关心 C 风格的代码,我有更好的事情要做,而不是一直担心我的缓冲区大小)。

例如,这里有一个“Quick & Dirty”技巧来获取字符数(这对于了解它是否适​​合您的显示框很有用):

#include <string>
#include <algorithm>

// Let's remember than in utf-8 encoding, a character may be
// 1 byte: '0.......'
// 2 bytes: '110.....' '10......'
// 3 bytes: '1110....' '10......' '10......'
// 4 bytes: '11110...' '10......' '10......' '10......'
// Therefore '10......' is not the beginning of a character ;)

const unsigned char mask = 0xC0;
const unsigned char notUtf8Begin = 0x80;

struct Utf8Begin
{
bool operator(char c) const { return (c & mask) != notUtf8Begin; }
};

// Let's count
size_t countUtf8Characters(const std::string& s)
{
return std::count_if(s.begin(), s.end(), Utf8Begin());
}

事实上,我还没有遇到一个用例,我需要除字符数以外的任何东西,并且 std::string 或 STL 算法不免费提供,因为:

  • 排序符合预期
  • 一个词的任何部分都不能混淆为一个词或另一个词的一部分

我想知道您是否有其他类似的技巧,用于计数和其他简单任务。
我再说一遍,我知道 ICUUtf8-CPP ,但我对它们不感兴趣,因为我不需要完整的处理(事实上,我只需要字符数)。
我还要重申,我对处理 char* 不感兴趣,它们已经过时了。

最佳答案

好吧,这个卑鄙的把戏是行不通的。首先,mask 的值是多少:

   const unsigned char mask = 0x11000000;
const unsigned char notUtf8Begin = 0x10000000;

也许您将十六进制表示与二进制混合。

其次,正如您在 utf-8 编码中所说的那样,一个字符可能有几个字节长。std::count_if 将遍历 UTF8 序列中的所有字节。但您真正需要的是查看每个字符的前导字节并跳过其余部分,直到下一个字符出现。

实现一个计算并向前跳转的单循环并不难对前导字节使用简单的掩码表。

最后,您会得到相同的 O(n) 来检查字符,它适用于每个 UTF8 字符串。

关于c++ - C++ 中的 Utf-8 : quick & dirty tricks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1499688/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com