Как открыть текстовый файл utf 16 Big Endian в c ++ - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь открыть и преобразовать текстовые файлы всех типов кодировки в моем проекте блокнота.

Я успешно получил текстовые данные из всех файлов типов, кроме 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...