将字符串转换为UTF-8转义序列

Convert string to UTF-8 escape sequence

本文关键字:UTF-8 转义序列 转换 字符串      更新时间:2023-10-16

在我的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