Gar*_*iff 5 c++ unicode ofstream writetofile
我在用C ++将unicode写入文件时遇到问题。我想用自己的扩展名向文件中写入一些笑脸,您可以通过键入ALT + NUMPAD(2)获得这些笑脸。我可以通过创建一个字符并为其分配值'\ 2'来在CMD上显示它,它会显示一个笑脸,但不会将其写入文件。
这是我的程序的代码片段:
ofstream myfile;
myfile.open("C:\Users\My Username\test.exampleCodeFile");
myfile << "\2";
myfile.close();
Run Code Online (Sandbox Code Playgroud)
它将写入文件,但不会显示我想要的内容。我会告诉您它显示的内容,但是StackOverflow不会让我显示该字符。提前致谢。
您必须使用 Unicode 来指定要显示的字符。02h
控制台中由字节表示的字符由代码页 437 ( cp437 ) 转换为 Unicode 字符U+263B
。使用带有 BOM 的以 UTF-8 保存的源文件可以更轻松地使用 Unicode,因为您可以粘贴或键入所需的字符,而无需求助于 Unicode 转义码。
对于文件流,需要为 UTF-8 配置流。有多种方法可以做到这一点,这取决于编译器,但使用 Visual Studio 2012,以 UTF-8 格式保存的源代码和 BOM,以及一些谷歌搜索:
#include <locale>
#include <codecvt>
#include <fstream>
#include <iostream>
#include <io.h>
#include <fcntl.h>
using namespace std;
int main()
{
const std::locale utf8_locale = std::locale(std::locale(), new std::codecvt_utf8<wchar_t>());
wofstream f(L"sample.txt");
f.imbue(utf8_locale);
f << L"\u263b???????????" << endl;
_setmode(_fileno(stdout),_O_U16TEXT);
wcout << L"\u263b???????????" << endl;
}
Run Code Online (Sandbox Code Playgroud)
sample.txt
在记事本中查看的内容:
????????????
Run Code Online (Sandbox Code Playgroud)
十六进制转储(正确的 UTF-8):
E68891E698AFE7BE8EE59BBDE4BABAE38082E68891E58FABE9A9ACE5858BE380820D0A
Run Code Online (Sandbox Code Playgroud)
输出到控制台剪切和粘贴在这里。视觉显示是?对于每个没有正确字体的汉字,但字符显示正确粘贴到 SO 或记事本中。
????????????
Run Code Online (Sandbox Code Playgroud)
ALT + NUMPAD2与ASCII字符2不同,这是您的代码写入文件的内容。ALT代码是DOS处理非ASCII字符的方式。CMD.COM为ALT + NUMPAD2显示的标志符号实际上是Unicode代码点U + 263B“ BLACK SMILING FACE”。作为Unicode字符,最好不要使用UTF-8或UTF-16编码文件,例如:
ofstream myfile;
myfile.open("C:\\Users\My Username\\test.txt");
myfile << "\xEF\xBB\xBF"; // UTF-8 BOM
myfile << "\xE2\x98\xBB"; // U+263B
myfile.close();
Run Code Online (Sandbox Code Playgroud)
。
ofstream myfile;
myfile.open("C:\\Users\\My Username\\test.txt");
myfile << "\xFF\xFE"; // UTF-16 BOM
myfile << "\x3B\x26"; // U+263B
myfile.close();
Run Code Online (Sandbox Code Playgroud)
两种方法都会在记事本中显示一个笑脸(前提是您使用支持笑脸的字体),因为它首先读取BOM表,然后根据此解码相应的Unicode代码点。
归档时间: |
|
查看次数: |
15002 次 |
最近记录: |