我知道有关于utf-8的各种问题,主要是关于图书馆来处理像对象一样的utf-8'字符串'。我正在研究一个'国际化'的项目(一个网站,我编写了一个C++后端...不问),即使我们处理utf-8,我们也不需要这样做库。大多数情况下,普通的std :: string方法或STL算法都足以满足我们的需求,实际上这是首先使用utf-8的目标。在c + +的Utf-8:快速和肮脏的技巧
所以,我在找在这里是你知道的相关UTF-8存储的std :: string(没有为const char *的“快速&脏”技巧的资本,我不关心c风格的代码真的,我有更好的事情要做,而不是经常担心我的缓冲区大小)。
例如,这里是一个“快速&脏”伎俩获得的字符数(这是很有必要知道它是否适合你的显示框):
#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算法否则不提供免费的,因为:
- 排序按预期工作
- 没有一个字的一部分可以被混淆,一个字一个字或部分
我想知道你是否有其他类似的技巧,既为计数和其他简单任务。
我再说一遍,我知道ICU和Utf8-CPP,但我对它们不感兴趣,因为我不需要一个完整的治疗(实际上我从来不需要超过字符数)。
我也重复说我对char *的处理不感兴趣,它们是老式的。
那么结合变音符号对你无关紧要?这很伤心。他们可能是你算的人物,但他们不占用更多的空间。实际上任何组合角色。或零宽度的空间。排序如预期般运作?你能指望什么?如果有意不使用Unicode(除非是某种字节数组),那么任何特定于语言环境的排序如何知道排序规则。 – Joey 2009-09-30 18:02:02
查看我的编辑,我的应用程序是网站的后端,因此语言环境在浏览器中。我们从来没有遇到过结合角色的问题,我听说过他们,但从未见过他们,你遇到过哪些语言? – 2009-09-30 18:14:45
几个不适用于非英文文本的用例:排序,案例折叠,匹配(例如德语ß和ss)。 – 2009-09-30 18:26:12