繁体   English   中英

如何从UTF-8字符串的每个字符中获取UNICODE代码?

[英]How to get the UNICODE code from each character of a UTF-8 string?

使用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为该任务提供哪些标准库工具?

您可以使用提供的转换std::wstring_convert来自<locale> std::wstring_convert ,将字符串简单地转换为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)  { /* ... */ }
}

使用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许可的代码中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM