C++ 如何在C++;?

C++ 如何在C++;?,c++,text,C++,Text,我正试图写一个小程序,颠倒文本文件中字符的顺序。它是有效的,但它对撇号和其他特殊字符处理得很奇怪 这是我的密码: ifstream ifs{name}; 如果(!ifs)抛出运行时_错误(“无法打开输入文件”); of流{“output.txt”}; 如果(!ofs)抛出运行时_错误(“无法打开输出文件”); 字符串s; for(char-ch;if.get(ch);) s、 推回(ch); 反向(s.开始(),s.结束()); 用于(字符ch:s) ofs您的输入文件可能编码为多字节字符集。但

我正试图写一个小程序,颠倒文本文件中字符的顺序。它是有效的,但它对撇号和其他特殊字符处理得很奇怪

这是我的密码:

ifstream ifs{name};
如果(!ifs)抛出运行时_错误(“无法打开输入文件”);
of流{“output.txt”};
如果(!ofs)抛出运行时_错误(“无法打开输出文件”);
字符串s;
for(char-ch;if.get(ch);)
s、 推回(ch);
反向(s.开始(),s.结束());
用于(字符ch:s)

ofs您的输入文件可能编码为多字节字符集。但它似乎不是UTF-8,因为
-
在UTF-8中编码为字节
E2 80 94
,当用拉丁语-1解释时,它是
,而
在UTF-8中编码为字节
E2 80 99
,即
当用拉丁语-1解释时。不过,这并不是您在输出中看到的结果。但症状相似。您正在按原样反转
字符串
中已编码的
字符
s,这对多字节编码不起作用

要正确反转多字节编码字符串,您必须事先知道编码,并根据该编码遍历字符串,提取编码单元的每个完整序列并将每个完整单元按原样保存到输出,而不是按原样读取和保存单个
char
s
std::reverse()
无法帮助您实现这一点,除非您使用的迭代器知道如何读取和写入这些完整的单元

如果您事先知道编码,那么使用
std::wifstream
/
std::wofstream
可能会更好,因为它们在
imbue()
中为编码添加了合适的
std::locale
。然后使用
std::wstring
而不是
std::string
。但是,至少在Windows上,
std::wstring
使用UTF-16时,仍然存在处理多单元序列的问题(尽管频率较低,除非处理的是东亚语言)。因此,在进行反转之前,您可能必须将解码的UTF-16输入转换为UTF-32(然后您必须处理多码点图形集簇),然后将UTF-32转换为UTF-16,然后将其编码保存到输出文件中


此外,如果要按原样处理单个
char
s,为确保正确读取和写入原始
char
s,应以二进制模式打开文件,并使用未格式化的输入/输出操作(即,无
运算符>>
运算符这些字符看起来是Unicode字符。这回答了您的问题吗?您好,也许您的输入是UTF-8而不是ascii(例如em破折号字符)。这可能会有所帮助。我不知道这是否会产生影响,但请尝试改用
wchar
(宽
字符
)。
And—which is more—you’ll be a Man, my son!
!nos ym ,naM a eb llôÄ‚uoyîÄ‚erom si hcihwîÄ‚dnA