Я новичок в программировании и работал над некоторыми примерами из моего учебника по C ++. Я смог выполнить большинство примеров, но возникло несколько проблем, когда я попытался сделать следующее: Попытка отобразить китайские иероглифы в программе, похожей на «Hello World!»
На вопрос, касающийся ввода / вывода не-юникодных символов, таких как упрощенный китайский, я хотел бы предложить некоторую информацию о том, что я пытался до сих пор:
Я управлял «Привет, мир!» Программа на коде: блокирует использование C ++ и пытается заменить текст «Hello world» на китайские символы «你好». Я запустил программу, но в командной строке вывод был просто бессмысленным (乱码). Итак, я искал информацию в Интернете и обнаружил, что мне пришлось изменить региональную настройку на «Упрощенный, Китай». Я сделал это, перезагрузил компьютер и снова запустил программу. На этот раз выходные данные программы были не-юникодными символами, однако они были неправильными символами (это: 浣 犲 ソ and), и я также считаю, что это тоже японский … Некоторые ресурсы на китайском языке в интернете заявили об этом быть кодировкой для «你好», но я не слишком уверен. Я просто хочу текст, который я пишу позади (std :: cout << «— \ n»;) для правильного отображения, как если бы я использовал английский. Как бы я получить его, где он будет отображать то, что я пишу в коде: блок в командной строке?
Наконец, появилось сообщение о том, что кодировка была изменена, потому что я использовал недопустимые символы …
Попробовав следующее:
#include <iostream>
int main()
{
std::cout << "你好" << std::endl;
return 0;
}
Я получил вывод:
你好
Которые мне кажутся одинаковыми персонажами (я смиренно извиняюсь, если не вижу разницы, которую вы делаете). Это заставляет меня думать, что проблема заключается в несовпадении преобразования символов в байты при сохранении файла и / или компиляции с одной стороны и отображении преобразования байтов в символы во время выполнения.
Мой правильный вывод был на XUbuntu с использованием g ++ 4.8.4. Файл cpp был сохранен с помощью vim и выглядит так:
00000000: 23 69 6e 63 6c 75 64 65 20 3c 69 6f 73 74 72 65 #include <iostre
00000010: 61 6d 3e 0a 0a 69 6e 74 20 6d 61 69 6e 28 29 0a am>..int main().
00000020: 7b 0a 09 73 74 64 3a 3a 63 6f 75 74 20 3c 3c 20 {..std::cout <<
00000030: 22 e4 bd a0 e5 a5 bd 22 20 3c 3c 20 73 74 64 3a "......" << std:
00000040: 3a 65 6e 64 6c 3b 0a 09 72 65 74 75 72 6e 20 30 :endl;..return 0
00000050: 3b 0a 7d 0a -- -- -- -- -- -- -- -- -- -- -- -- ;.}.------------
Как видите, каждый символ сохраняется как последовательность из 3 байтов UTF-8 (кодирование битов выделено жирным шрифтом):
Поскольку в свое время у вас было 4 символа текста, я считаю, что эти байты каким-то образом на самом деле компилируются как UTF-8, но потом читаются как-то иначе. Если они читаются как UTF-16, это попыталось бы сгенерировать 3 символа (2 байта на символ), но это маловероятный сценарий, так как стандарт создан таким образом, чтобы избежать такой путаницы, а также потому, что вы на самом деле есть 4 символа, и для UTF-16 невозможно использовать меньше 2 байта хана для генерации символа.
На данный момент я должен сказать, что у меня нет достаточно информации, чтобы попытаться помочь вам в дальнейшем. Пожалуйста, рассмотрите возможность предоставления точного кода, который вы пытаетесь скомпилировать, и, если возможно, его шестнадцатеричное представление.