2015-09-08 5 views
0

Я новичок в программировании и работал над некоторыми примерами в своем учебнике на C++. Я смог выполнить большинство примеров, но возникли проблемы, когда я попытался сделать следующее: Попытка отображать китайские иероглифы в программе, подобной «Hello World!».(C++). Язык ввода Unicode (упрощенный китайский)

  1. На вопрос, что касается ввода/вывода не-юникод символов, таких как упрощенный китайский, я хотел бы предложить некоторую информацию относительно того, что я пытался до сих пор:

    Я управлял " Привет мир!" программа на Code: Блоки с использованием C++ и попыталась заменить текст «Hello world» на китайские иероглифы «你好». Я запускал программу, но в командной строке вывод был просто тарабарщиной (乱码). Итак, я искал в Интернете информацию и выяснил, что мне пришлось изменить свои региональные настройки на «Упрощенный, Китай». Я сделал это, перезагрузил свой компьютер и снова запустил программу. На этот раз вывод программы был в символах, отличных от юникода, однако они были неправильными символами (эти: 浣 犲 ソ 锛), и я также считаю, что это тоже японский язык ... Некоторые ресурсы на китайском языке в Интернете заявили об этом быть кодировкой для «你好», но я не слишком уверен. Я просто хочу, чтобы текст, который я пишу (std :: cout < < «--- \ n»;) отображался правильно, как если бы я использовал английский. Как мне получить его, где он будет отображать то, что я пишу в Code: Block on the Command Prompt?

Наконец, была подсказка, которая выскочила о том, что кодирование было изменено, потому что я использовал недопустимые символы ...

+1

Добро пожаловать в SO. Хорошо, что вы дали нам некоторую информацию о том, что вы пробовали, но этот вопрос в значительной степени выиграет от минимального фрагмента кода, который кто-то из этого сообщества может попытаться скомпилировать. – Mikhail

ответ

1

Попробовав следующее:

#include <iostream> 

int main() 
{ 
     std::cout << "你好" << std::endl; 
     return 0; 
} 

Я получил выход :

你好 

Который мне кажется похожим персонажем (я смиренно извиняюсь, если я не делаю я вижу разницу, которую вы делаете). Это заставляет меня думать, что проблема заключается в несоответствии преобразования символов в байт при сохранении файла и/или компиляции с одной стороны и преобразовании отображения в байт-символ во время выполнения.

Мой правильный выход был на XUbuntu, используя g ++ 4.8.4. Файл каст был сохранен с 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 (кодирования битов выделены жирным шрифтом):

  • 你 - 1110 - символ 77664
  • 好 - 1110 - символ 22909

Поскольку в свое время вы получили 4-х символов текста, я считаю, что так или иначе эти байты фактически компилируются в UTF-8 просто прекрасно, но затем читаются как-то еще.Если они читаются как UTF-16, которые попытаются сгенерировать 3 символа (2 байта на символ), но это не вероятный сценарий, поскольку стандарт создается таким образом, чтобы избежать такой путаницы, а также потому, что вы фактически получил 4 символа, и UTF-16 не может использовать меньше han 2 байта для генерации символа.

В этот момент я должен сказать, что у меня недостаточно информации, чтобы попытаться помочь вам дальше. Пожалуйста, подумайте о том, чтобы указать точный код, который вы пытаетесь скомпилировать, и, если возможно, его шестнадцатеричное представление.

+0

К OP: прочитайте [utf8everywhere] (http://utf8everywhere.org/) –

 Смежные вопросы

  • Нет связанных вопросов^_^