使用C ++ 11,我如何从UTF-8编码的std::string
中获取文本中每个字符的Unicode值到uint32_t
?
类似的东西:
void f(const std::string &utf8_str)
{
for(???) {
uint32_t code = ???;
/* Do my stuff with the code... */
}
}
假设主机系统区域设置是UTF-8有帮助吗? C ++ 11为此任务提供了哪些标准库工具?
答案 0 :(得分:5)
您可以使用提供的转化方面和来自<locale>
的{{3}}将字符串转换为UTF-32编码的字符串:
#include <codecvt>
#include <locale>
#include <string>
void foo(std::string const & utf8str)
{
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv;
std::u32string utf32str = conv.from_bytes(utf8str);
for (char32_t u : utf32str) { /* ... */ }
}
答案 1 :(得分:1)
使用http://utfcpp.sourceforge.net/中的<utf8.h>
您可以编码:
static inline void fix_utf8_string(std::string& str)
{
std::string temp;
utf8::replace_invalid(str.begin(), str.end(), back_inserter(temp));
str = temp;
}
static inline bool valid_utf8_cstr(const char*s)
{
if (!s) return false;
const char* e = s+strlen(s);
return utf8::is_valid(s,e);
}
static inline size_t
utf8_length(const char*s)
{
if (!s) return 0;
const char* e = s+strlen(s);
return utf8::distance(s,e);
}
// apply a function to every code point, exiting if that function
// gives true and return the number of visited code points
static inline size_t
utf8_foreach_if(const char*s,
std::function<bool(uint32_t,size_t)>f)
{
if (!s) return 0;
size_t ix=0;
const char*pc = s;
while(*pc)
{
const char*epc
= (pc[1]==0)?(pc+1):(pc[2]==0)
?(pc+2):(pc[3]==0)?(pc+3):(pc+4);
uint32_t c = utf8::next(pc,epc);
if (f(c,ix)) break;
ix++;
};
return ix;
}
static inline size_t
utf8_foreach_if(const std::string& s,
std::function<bool(uint32_t,size_t)>f)
{
if (s.empty()) return 0;
size_t ix=0;
const char*pc = s.c_str();
const char*epc = pc + s.size();
while(*pc)
{
uint32_t c = utf8::next(pc,epc);
if (f(c,ix)) break;
ix++;
};
return ix;
}
这是从GPLv3许可的一些代码中提取的,我将在几周或几个月内发布。