Я пытаюсь открыть и преобразовать текстовые файлы всех типов кодировки в моем проекте блокнота.
Я успешно получил текстовые данные из всех файлов типов, кроме utf 16 big endian.
Здесь это мой код операции File :: Load ():
#include "File.h"
#include <locale.h>
#include <windows.h>
using namespace std;
/* skip other codes */
string File::Load() {
string content = "";
string mode = "";
int encode;
string type;
FILE *file;
fopen_s(&file, this->name.c_str(), "rb");
if (file != NULL) {
encode = fgetc(file);
if (encode == 254) {
type = "BE";
mode = "rt";
}
else if (encode == 255) {
type = "LE";
mode = "rt, ccs=UTF-16LE";
}
else if (encode == 239) {
type = "UTF8 BOM";
mode = "rt, ccs=UTF-8";
}
else if (encode > 200) {
type = "UTF8";
mode = "rt, ccs=UTF-8";
}
else {
type = "ANSI";
mode = "rt";
}
fclose(file);
}
char (*line) = new char[99999];
wchar_t (*wLine) = new wchar_t[99999];
string str;
setlocale(LC_ALL, "ko-KR");
if (fopen_s(&file, this->name.c_str(), mode.c_str()) == 0) {
while (!feof(file)) {
if (type == "BE") {
fgetws(wLine, 99998, file);
WideCharToMultiByte(CP_ACP, 0, wLine, -1, line, 99999, NULL, NULL);
}
else if (type == "LE") {
fgetws(wLine, 99998, file);
WideCharToMultiByte(CP_ACP, 0, wLine, -1, line, 99999, NULL, NULL);
}
else if (type == "UTF8 BOM") {
fgetws(wLine, 99998, file);
WideCharToMultiByte(CP_ACP, 0, wLine, -1, line, 99999, NULL, NULL);
}
else if (type == "UTF8") {
fgetws(wLine, 99998, file);
WideCharToMultiByte(CP_ACP, 0, wLine, -1, line, 99999, NULL, NULL);
}
else if (type == "ANSI") {
fgets(line, 99998, file);
}
str = string(line);
if (str.at(str.length() - 1) == '\n') {
str = str.substr(0, str.length() - 1);
}
content += str + "\r\n";
}
fclose(file);
}
content = content.substr(0, content.length() - 2);
if (line != 0) {
delete[] line;
}
if (wLine != 0) {
delete[] wLine;
}
return content;
}
В моем случае проблема заключается в открытом режиме для utf 16 big endian.
Я пробовал все флаги ccs, написанные в msdn .
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/fopen-s-wfopen-s?view=vs-2019
Вот так:
if (encode == 254) {
type = "BE";
mode = "rt";
//1.// mode = "rt, ccs=UNICODE";
//2.// mode = "rt, ccs=UTF-16LE";
//3.// mode = "rt, ccs=UTF-8";
}
Но функция fopen_s вызывает ошибку, подобную этому изображению, в каждом «режиме», который я пробовал. введите описание изображения здесь
Если я открываю файл с помощью только «rt», многобайтовые символы не работают.
как я могу открыть и преобразовать текстовый файл utf 16 big endian?
Спасибо за вашу помощь.
Дополнительный вопрос:
Я также хочу знать, как одновременно устанавливать различные языковые стандарты.
setlocale(LC_ALL, "ko-KR");
Приложение не может правильно прочитать специфику c языки, такие как арабский.
Я работаю над Windows 10, VS2019.