2016-07-18 7 views
3

Я видел десятки вопросов по этой теме, но ни один из них не помог мне.C++ написать текст не в английском формате

Предположим, у меня есть строка «հայեր» или «русский» (wchat_t*, wstring, LPTSTR, или что-то еще).

Теперь я хочу создать выходной файл «res.txt» и записать строку вниз. Пытаясь написать это, я закончил тем, что ничего не писал, «?» и некоторые произвольные числа в файл.

Может кто-нибудь предложить мне способ сохранить неанглийские строки и как правильно записать их в файл?

Спасибо.

+1

Как вы написали файл? Если вы используете 'wchar_t *' или 'std :: wstring', вы должны использовать' std :: wofstream'. – NathanOliver

+0

Я пробовал, но не из комбинаций. Итак, вы предлагаете сохранить его как wstring и использовать wofstream? Если да, то он ничего не пишет в файле – mbaros

+0

Как закодирован исходный файл? utf8, Latin-1, ...? – Jarod42

ответ

0

Это сработало для меня хорошо.

#include <fstream> 
    #include <locale> 
    #include <codecvt> 

    const locale utf8_locale = locale(locale(), new codecvt_utf8<wchar_t>()); 
    wofstream file(url); 
    file.imbue(utf8_locale); 
    file << L"իմբյու" << endl; 
0

Вы должны использовать кодировку unicode.

+0

Как? Можете ли вы привести полный пример, пожалуйста? – mbaros

+0

Вам нужно использовать escapes в форме «\ uXXXX» (Xs означает десятичные числа) - таким образом вы можете использовать символы Unicode в своем коде. К сожалению, это довольно непрактично, когда весь текст в этих символах. C++ имеет довольно плохое использование unicode в целом ... (так что если вся ваша программа основана на unicode, я бы предложил использовать какой-то другой язык) – Sia

+0

wow ... это довольно сильное утверждение. Я часто использую C++, и у меня есть нулевые проблемы с unicode. Но это сводится к тому, как вы его используете, и что вам нужно. Поскольку я живу в мире linux, большинство строк/текстов вокруг кодируются UTF-8, что очень хорошо работает с C++.В Windows они решили пойти на UTF-16, который немного сложнее в источниках C++ (но с хорошей IDE и вашей памятью, чтобы отметить каждый строковый литерал «широко», это должно быть хорошо), но IMO работает вполне нормально, далека от «плохое использование». Также нет необходимости работать с \ uXXXX явно, если вы хорошо планируете и знаете, что делаете. – Ped7g

2

Перед тем, как можно даже начать задачу создания текстовых файлов, содержащих не латинские символы, вы должны определить, какую кодировку использовать для вашей местности.

Например, если ваш язык использует кодировку UTF-8, строка «русский» должна быть закодирована совершенно иначе, чем если бы ваш язык был KOI8-R.

Строка «русский» в UTF-8 представлена ​​октетами (байтами): d1 80 d1 83 d1 81 d1 81 d0 ba d0 b8 d0 b9. Для локали KOI8-R эквивалентными октетами являются d2 d5 d3 d3 cb c9 ca.

Интернационализация сложная.

В большинстве случаев вы можете быть в состоянии использовать широкий характер библиотеки C++ потоки с юникодом:

#include <iostream> 
#include <locale> 

int main() 
{ 
    std::locale::global(std::locale("")); 
    std::wcout << L"\u0440\u0443\u0441\u0441\u043a\u0438\u0439" << std::endl; 
    return 0; 
} 

Будем надеяться, что выход из этого будет «русский», на вашей платформе. Если это работает, это может быть путь наименьшего сопротивления, но вам придется искать значения юникода для каждого символа.

Существует также поддержка UTF-8 в новом стандарте C++, но здесь вы должны провести некоторое время, просвещая себя об общих концепциях языка, юникода и интернационализации. Это будет трудно сделать правильно, без полного понимания того, как все это работает.

+0

ничего не выйдет ни на консоли, ни в файле te. – mbaros

+0

Тогда ваш компилятор или операционная система C++ не поддерживает даже минимальные требования к текущему стандарту C++; или ваш текущий язык не включает кириллицу. Дальнейшее определение не может быть определено без знания компилятора и локали системы. –