(C ++). Не-Unicode язык (упрощенный китайский) ввода / вывода

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

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

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

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

0

Решение

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

#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 (кодирование битов выделено жирным шрифтом):

  • 你 — 11100100 10111101 10100000 — персонаж 77664
  • 好 — 11100101 10100101 10111101 — персонаж 22909

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

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

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector