我正在尝试将Unicode代码点转换为百分比编码的UTF-8代码单元。
Unicode - > UTF-8转换似乎工作正常,正如一些使用印地语和中文字符的测试所示,这些测试在使用UTF-8编码的Notepad ++中正确显示,并且可以正确翻译。
我认为百分比编码就像在每个UTF-8代码单元前面添加'%'一样简单,但这并不是很有效。我没有看到%E5%84%A3 ,而是看到%xE5%x84%xA3 (对于unicode U + 5123)。
我做错了什么?
添加了代码(请注意,utf8.h属于UTF8-CPP库)。
#include <fstream>
#include <iostream>
#include <vector>
#include "utf8.h"
std::string unicode_to_utf8_units(int32_t unicode)
{
unsigned char u[5] = {0,0,0,0,0};
unsigned char *iter = u, *limit = utf8::append(unicode, u);
std::string s;
for (; iter != limit; ++iter) {
s.push_back(*iter);
}
return s;
}
int main()
{
std::ofstream ofs("test.txt", std::ios_base::out);
if (!ofs.good()) {
std::cout << "ofstream encountered a problem." << std::endl;
return 1;
}
utf8::uint32_t unicode = 0x5123;
auto s = unicode_to_utf8_units(unicode);
for (auto &c : s) {
ofs << "%" << c;
}
ofs.close();
return 0;
}
答案 0 :(得分:3)
您实际上需要将字节值转换为相应的ASCII字符串,例如:
UTF-8中的 "é"
是值{ 0xc3, 0xa9 }
。请注意,这些是C ++中的字节char
值。
每个字节需要分别转换为:"%C3"
和"%C9"
。
最好的方法是使用sstream:
std::ostringstream out;
std::string utf8str = "\xE5\x84\xA3";
for (int i = 0; i < utf8str.length(); ++i) {
out << '%' << std::hex << std::uppercase << (int)(unsigned char)utf8str[i];
}
或者在C ++ 11中:
for (auto c: utf8str) {
out << '%' << std::hex << std::uppercase << (int)(unsigned char)c;
}
请注意,需要将字节强制转换为int
,否则<<
运算符将使用litteral二进制值。
首先需要转换为unsigned char
,否则符号位将传播到int
值,从而导致输出负值FFFFFFE5
。