如何将无符号十六进制值转换为相应的unicode字符,这些字符应该使用c++写入文件

How to convert unsigned hex values to corresponding unicode characters which should be written to file using c++

本文关键字:字符 文件 c++ unicode 十六进制 无符号 转换      更新时间:2023-10-16

我需要将无符号十六进制值转换为相应的unicode字符,这些字符应该使用c++写入文件

到目前为止,我已经试过这个

unsigned short array[2]={0x20ac,0x20ab};

应该使用c++ 将其转换为文件中的相应字符

这取决于您选择的编码。

如果使用UTF-8编码,则需要首先将每个Unicode字符转换为相应的UTF-8字节序列,然后将该字节序列写入文件。

它的伪代码将类似

 EncodeCharToUTF8(charin, charout, &numbytes); //EncodeCharToUTF8(short,char*, int*);
 WriteToFile(charout, numchar);

如果您使用UTF-16编码,您需要首先在文件的开头写入BOM,然后将每个字符编码为UTF-16字节序列(字节顺序在这里很重要,无论是小端还是大端,取决于您的BOM)。

 WriteToFile("xFFxFE", 2); //Write BOM
 EncodeCharToUTF16(charin, charout, &numbytes); //EncodeCharToUTF16(short,char*, int*);
 //Write the character.
 WriteToFile(charout, numchar);

尽管步骤与UTF-16类似,但不建议使用UTF-32。

我认为这应该有助于你开始。

从您的阵列来看,您似乎要使用UTF-16。为小端序编写UTF-16 BOM 0xFFFE,为大端序编写0xFEFF。之后,按照机器的字节顺序写入每个字符。

我在这里给出了伪代码,你可以把它白框起来。搜索有关编码转换的更多信息。

实际上您正面临两个问题:

1.如何将缓冲区从UTF-8编码转换为UTF-16编码
我建议你使用boost语言环境库,示例代码可以是这样的:

    std::string ansi = "This is what we want to convert";
try
{           
    std::string utf8 = boost::locale::conv::to_utf<char>(ansi, "ISO-8859-1");
    std::wstring utf16 = boost::locale::conv::to_utf<wchar_t>(ansi, "ISO-8859-1");
    std::wstring utf16_2 = boost::locale::conv::utf_to_utf<wchar_t, char>(utf8);
}
catch (boost::locale::conv::conversion_error e)
{
    std::cout << "Fail to convert to unicode!" << std::endl;
}

2.如何将缓冲区保存为UTF-16编码的文件
这涉及到手动在文件开头写入BOM(ByteOrderMark),您可以在此处找到参考

这意味着,如果要将编码为UTF-8的缓冲区保存到UNICODE文件中,则应首先在输出文件的开头写入3个字节的"EF BB BF"

"FE FF"适用于Big Endian UTF-16,
"FF FE"适用于Little Endian UTF-16。

我你仍然不明白BOM是如何工作的,只要打开一个记事本,写一些单词,用不同的"编码"选项保存它,然后用十六进制编辑器打开保存的文件,你就可以看到BOM了

希望它能帮助你!