需要注意的编码方式有三处:
操作系统、程序编码(与源文件编码一致)、通信对方传入字符的编码
程序编码(与源文件编码一致) | 操作系统编码 | 对方传入的编码 | 中文是否ok | c2A0编码的空格 |
utf-8 | utf-8 | utf-8 | ok | ok |
utf-8 | gbk | gbk 正常中文可以,特殊空格不行 | ok | 不ok |
gbk | gbk | gbk | ok | 不ok |
一、操作系统
本地文件路径编码跟随操作系统的编码
如操作系统编码为GBK
(修改为UTF8的方法)
看操作系统文件编码:复制文件名到UE中,然后Ctrl + H看编码格式二、程序
源文件编码会对字符串编码产生影响(string格式自带编码方式、char[]不含编码)
三、特殊空格字符C2A0(半角非中断空格)
note:
在UTF-8编码里面存在一个特殊的字符,其编码是“0xC2 0xA0”,转换成字符的时候表现为一个半角空格,跟一般的半角空格(ASCII 0x20)不同的是它的宽度不会被压缩,所以排版中常能用到它,常出现于HTML中的 。但是GB2312、Unicode之类并没有这样的字符因此在GBK编码的环境下,将无法处理这样的字符
附:
1 //测试读取指定目录下所有文件(编码),并尝试打开文件 2 void scan_directory(const std::string& path) { 3 WIN32_FIND_DATA fileData; 4 string pathAll = path + "*"; 5 HANDLE hFind = FindFirstFile(pathAll.c_str(), &fileData); 6 if (hFind != INVALID_HANDLE_VALUE) { 7 do { 8 // 跳过目录和子目录 9 if (!(fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { 10 std::cout << path << fileData.cFileName << std::endl; 11 //string pathFile <<fileData.cFileName; 12 std::ifstream file(path + fileData.cFileName, std::ios::in | std::ios::binary); 13 if (!file.is_open()) { 14 std::cerr << "Error opening file: " << fileData.cFileName << std::endl; 15 LOG_ERROR_ZHWD("Error opening file %s\n", fileData.cFileName); 16 //return FILE_ERROR; 17 } 18 file.close(); // 确保文件正确关闭 19 } 20 } while (FindNextFile(hFind, &fileData)); 21 FindClose(hFind); 22 } 23 else { 24 std::wcerr << L"Error occurred while listing directory." << std::endl; 25 } 26 } 27 int main() { 28 string path = "D:/temp2024/"; 29 scan_directory(path); 30 return 0; 31 }
引用: UTF-8转GBK的悲剧:特殊字符C2A0_gbk特殊字符-CSDN博客
c2a0 这样的空格 NO-BREAK SPACE - 简书 (jianshu.com) (侵删) 标签:编码,ok,操作系统,字符,windows,gbk,C++,空格 From: https://www.cnblogs.com/jessicaland/p/18072523