将字符串转换为UTF-8转义序列
Convert string to UTF-8 escape sequence
在我的c++程序中,我想这样转换std:string:
abc €
转换为UTF-8转义序列:
abc%20%E2%82%AC
我需要它是独立于平台的!我所找到的解决方案只适用于windows。肯定有解决办法的,对吧?
对我来说似乎相当简单。你的字符串是一个序列字节。某些字节值(实际上是大多数,但不是最常见的)都是不允许的,应该用三个字代替吗序列'%'
后面跟着两个十六进制字符表示字节价值。比如:
std::string
toEscaped( std::string const& original )
{
std::string results ;
for ( std::string::const_iterator iter = original.begin();
iter != original.end();
++ iter ) {
static bool const allowed[] =
{
// Define the 256 entries...
};
if ( allowed[static_cast<unsigned char>(*iter)] ) {
results += *iter;
} else {
static char const hexChars[] = "0123456789ABCDEF";
results += '%';
results += hexChars[(*iter >> 4) & 0x0F];
results += hexChars[(*iter ) & 0x0F];
}
}
return results;
}
就可以了。
在c++ 11之前,标准中没有强制支持UTF-8。
这里有两个步骤:
- 转换为UTF-8(除非已经是UTF-8)
- url -转义结果(更新:James Kanze覆盖这部分)
如果您知道输入字符串使用的字符编码[*],那么为您自己编写可移植的
都不是特别困难。这意味着其他人已经做过了,你不需要自己写。如果您单独搜索它们,您可能会更幸运地为每个步骤找到与平台无关的代码。
注意,有两种不同的方式来转义一个空格字符,作为+
或%20
。您的示例使用%20
,因此,如果这对您很重要,那么不要意外地使用执行其他操作的url转义例程。
[*]
它不是ISO-Latin-1,因为它没有欧元符号[**],但它可能是Windows CP-1252。
[**]
除非是最近添加的。无论如何,您的示例将欧元符号编码为UTF-8字节0xE2 0x82 0xAC
,它表示Unicode代码点0x20AC
,而不是CP1252中的代码点0x80
。因此,如果它最初是单字节编码,那么显然在此过程中应用了智能的单字节到unicode码点转换。你可以说有三个步骤:
- 将
std::string
转换为Unicode码位(取决于输入编码)。 - 将Unicode转换为UTF-8
- url -转义UTF-8
对于平台独立的功能丰富的Unicode处理"事实上的"标准库是ICU,被许多财富500强公司和开源项目使用…该许可证是开源的,并且对商业开发非常友好
如果你只是想使用一些简单的转换,这可能是多余的…
http://site.icu-project.org如果你只需要一个简单的可移植的utf-8 c++库,你可以尝试http://utfcpp.sourceforge.net
hth
- 如何在C++中用'\'替换''来处理转义序列?
- 是否可以在原始字符串文本中插入转义序列?
- 使用无法适应其相关类型的转义序列
- C++二进制值的转义序列
- 使变量字符串忽略转义序列
- "Delete"的转义序列
- getchar() 避免转义序列
- GCC 编译时出现警告:未知转义序列:"\040"
- C++ 中转义序列的数据类型
- 如何在 QString 中解析转义序列
- "'"转义序列的目的是什么?
- C++ 无法识别的转义序列
- lex 中 OR ( | ) 的转义序列
- 转义序列?在 Qstring 中使用引号
- <<未找到运算符和无法识别的转义序列
- 调用 AINSI 转义序列时避免换行
- cmake 在窗口上生成错误,因为它使用 作为转义序列
- 如何分析具有原始转义序列的字符串
- 十六进制转义序列的最大长度
- 将字符串转换为UTF-8转义序列