在编写程序时,我遇到了特殊字符和常规字符的组合问题。当我分别将它们打印到控制台时,它们正常工作,但是当我在同一行中打印特殊字符和普通字符时,会出现错误的字符而不是预期的输出。
我的代码:#include <fstream>
#include <iostream>
#include <string>
using namespace std;
void initCharacterMap(){
const string normal = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()-_[]{};':\",.<>/?";
const string inverse = "∀Ↄ◖ƎℲ⅁HIſ⋊⅂WᴎOԀΌᴚS⊥∩ᴧMX⅄Zɐqɔpǝɟƃɥıɾʞʃɯuodbɹsʇnʌʍxʎz12Ɛᔭ59Ɫ860¡@#$%^⅋*)(-‾][}{؛,:„'˙></¿";
cout << normal << endl;
for(int i=0;i<normal.length();i++){
cout << normal[i];
}
cout << endl;
cout << inverse << endl;
for(int i=0;i<inverse.length();i++){
cout << inverse[i];
}
cout << endl;
for(int i=0;i<inverse.length();i++){
cout << normal[i] << inverse[i] << endl;
}
}
int main() {
initCharacterMap();
return 0;
}
并且控制台输出: https://paste.ubuntu.com/p/H9bqh67WPZ/
当在控制台中查看时,\XX字符会显示为未知字符符号,当我打开该日志时,警告说某些字符无法查看,并且编辑可能会损坏文件。
如果有人能给我一些建议来解决这个问题,将不胜感激。
编辑: 在遵循Marek R答案中的建议后,情况大有改善,但这仍然没有给我想要的结果。 新代码:
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
void initCharacterMap(){
const wchar_t normal[] = L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()-_[]{};':\",.<>/?";
const wchar_t inverse[] = L"∀Ↄ◖ƎℲ⅁HIſ⋊⅂WᴎOԀΌᴚS⊥∩ᴧMX⅄Zɐqɔpǝɟƃɥıɾʞʃɯuodbɹsʇnʌʍxʎz12Ɛᔭ59Ɫ860¡@#$%^⅋*)(-‾][}{؛,:„'˙></¿";
wcout << normal << endl;
for(int i=0;i<sizeof(normal)/sizeof(normal[0]);i++){
wcout << normal[i];
}
wcout << endl;
wcout << inverse << endl;
for(int i=0;i<sizeof(inverse)/sizeof(inverse[0]);i++){
wcout << inverse[i];
}
wcout << endl;
for(int i=0;i<sizeof(inverse)/sizeof(inverse[0]);i++){
wcout << normal[i] << inverse[i] << endl;
}
}
int main() {
initCharacterMap();
return 0;
}
新的控制台输出: https://paste.ubuntu.com/p/hcM7JB99zj/
现在,我不再遇到将字符串内容输出拼接在一起的问题了,但现在的问题是所有非ASCII字符都被替换成了问号。有没有办法让这些字符正确地输出?
std::string
和std::wstring
。后者特别用于表示ASCII范围之外的字符(wchar_t
比char
大)。 - Fureeish