C++windows编码问题

需要注意的编码方式有三处:

操作系统、程序编码(与源文件编码一致)、通信对方传入字符的编码

程序编码(与源文件编码一致)
操作系统编码
对方传入的编码
中文是否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中的&nbsp。但是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 }

 

(侵删)
posted @ 2024-03-14 11:43  jessicaland  阅读(151)  评论(0)    收藏  举报