Как сделать юникод в c

Добавил пользователь Skiper
Обновлено: 04.10.2024

Для представления персонажа можно использовать универсальные имена (UCNs). Характер 'ф' имеет значение Юникода U+0444 и так в C++, вы могли бы написать это '\u0444' или '\U00000444'. Также при кодировании исходный код поддерживает этот персонаж, то вы можете просто написать ее в буквальном смысле в исходном коде.

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

Эта программа does not требует 'ф' может быть представлен в одном Чаре. На OS X и большинство любой современный Линукс установить это будет прекрасно работать, потому что источник, исполнения и консоли кодировки будут в UTF-8 (который поддерживает все символы Unicode).

Все сложнее с Windows, и есть различные возможности с различными компромиссами.

Наверное, самое лучшее, если вы Don'т нужен переносимый код (вы'll быть через wchar_t, который действительно следует избегать на любой другой платформе), чтобы установить режим вывода дескриптор файла взять только данные UTF-16.

Я хочу, чтобы строки с символами Unicode правильно обрабатывались в моем приложении для синхронизации файлов, но я не знаю, как работает этот вид кодирования?

Это временное расположение, которое я нашел на данный момент (unicode-> utf8? Ascii ?, listFolder — это std :: string):

Решение

wchar_t была ранняя попытка обработки международных наборов символов, которая оказалась неудачной, потому что определение Microsoft wchar_t поскольку двух байтов оказалось недостаточно, когда Unicode был расширен за пределы кодовой точки 0x10000. Linux определяет wchar_t как четыре байта, но несоответствие делает это (и его производные std::wstring ) довольно бесполезен для переносимого программирования.

TCHAR такое определение Microsoft, которое разрешает char по умолчанию и WCHAR если UNICODE определяется с WCHAR в свою очередь wchar_t за уровнем косвенности … да.

C ++ 11 принес нам char16_t а также char32_t а также соответствующие строковые классы, но они все еще являются экземплярами basic_string<> и как таковые имеют свои недостатки, например, при попытке заглавных / строчных букв, которые имеют более одного заменяющего символа (например, немецкий ß потребуется расширить до SS в верхнем регистре; стандартная библиотека не может этого сделать).

СИС, с другой стороны, идет полным ходом. Например, он обеспечивает нормализацию и декомпозицию, чего нет в стандартных строках.

\uxxxx а также \UXXXXXXXX являются экранированными символами Юникода. xxxx 16-разрядное шестнадцатеричное число, представляющее кодовую точку UCS-2, которая эквивалентна кодовой точке UTF-16 в пределах Базовая многоязычная плоскость .

XXXXXXXX 32-битное шестнадцатеричное число, представляющее кодовую точку UTF-32, которая может быть любой плоскостью.

То, как эти экранированные символы обрабатываются, зависит от контекста, в котором они появляются (например, узкая / широкая строка), что делает их несколько менее совершенными.

u8". " является всегда const char[] в кодировке UTF-8.

u". " является всегда const uchar16_t[] в кодировке UTF-16.

U". " является всегда const uchar32_t[] в кодировке UTF-32.

Если вы используете \uxxxx или же \UXXXXXXXX в пределах одного из этих трех символьный литерал всегда будет расширен до правильной последовательности единиц кода.

Обратите внимание, что хранение UTF-8 в std::string является возможный, но опасно. Вы должны знать о многих вещах: .length() это не количество символов в вашей строке. .substr() может привести к частичной и недействительной последовательности. .find_first_of() не будет работать, как ожидалось. И так далее.

При этом, на мой взгляд, UTF-8 является только вменяемый выбор кодировки для любой сохраненный текст Существуют случаи, когда нужно обрабатывать тексты как UTF-16 в памяти (как ICU), но в файле не принимайте ничего, кроме UTF-8. Он экономит пространство, не зависит от порядка байтов и позволяет обрабатывать полусмысленно даже программным обеспечением, которое, к счастью, не знает, что такое Unicode (см. Предостережения выше).

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

Это escape-последовательность символов Юникода. Это будет интерпретировано как символ Юникода. u после escape-символа является частью синтаксиса, и именно это отличает его от других escape-последовательностей. Прочитайте документация для дополнительной информации.

Итак, что является подходящим объектом для обработки символов Юникода?

  • char для Уфт-8
  • char16_t для UTF-16
  • char32_t для utf-32
  • Размер wchar_t зависит от платформы, поэтому вы не можете делать переносимые предположения о том, какая кодировка подходит.

Если вы имеете в виду, что вы можете хранить многобайтовые символы utf-8 в char строка, тогда вы правы.

Это временное расположение, которое я нашел на данный момент (unicode-> utf8? Ascii ?, listFolder — это std :: string)

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

наша компания (и другие) используют открытый исходный код международные компоненты для Unicode (ICU) библиотека первоначально разработанная Taligent.

он обрабатывает строки, локали, преобразования, дату / время, параметры сортировки, преобразования и т. д. Эл.

с ICU Userguide

  • все строки, заключенные в _T ("моя строка")
  • strlen () etc. функции заменяется _tcslen() и т. д.
  • используйте LPTSTR и LPCTSTR вместо char * и const char*
  • при запуске новых проектов в dev Studio, религиозно убедитесь, что параметр Unicode выбран в свойствах проекта.
  • для строк C++ используйте std:: wstring вместо std:: string

Как было сказано выше библиотека является лучшим выбором при использовании большой системы. Однако иногда вы хотите обрабатывать вещи самостоятельно (возможно, потому, что библиотека будет использовать многие ресурсы, такие как микроконтроллер). В этом случае вам нужна простая библиотека, из которой вы можете скопировать детали для вещей, которые вам действительно нужны.

пример кода Willow Schlanger кажется хорошим (см. Его ответ для более подробной информации).

Я также нашел еще один, который меньший код, но не хватает полной проверки ошибок и только обрабатывает UTF-8, но было проще вынимать части.

вот список встроенных библиотек, которые выглядят прилично.

Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы

Проблемы с кодировкой кириллицы в консоли. Смена кодировки

Зачастую у программистов появляются проблемы с русским языком в консоли при загрузке в неё текстового файла – вместо кириллицы появляются какие-то непонятные символы или вопросительные знаки. Данная проблема очень легко решается – нужно просто сменить кодировку файла на UTF-8 или на Юникод (либо на какую-либо другую, с которой консоль заработает). Как это сделать, вы узнаете в нашей статье. Итак, если у вас в консоли вместо кириллицы написано что-то похожее на символы с нижнего изображения, либо просто непонятный набор неизвестных символов, то всё дело в неправильной кодировке файла.

Проблемы с кодировкой кириллицы в консоли. Смена кодировки - vscode.ru

Проблемы с кодировкой кириллицы в блокноте

У каждого на компьютере имеется блокнот – самый простой помощник в данной проблеме. Всё, что нам надо – это открыть “сломанный” файл в блокноте (главное, чтобы в нём русский язык отображался правильно, иначе придётся заново переписывать текст), затем нажать в блокноте вкладку “Файл”, а затем “Сохранить как…”. В низу появившегося окна можно будет найти надпись “Кодировка” с комбобоксом, в котором Вам надо выбрать UTF-8 либо Юникод (это почти одинаковые кодировки, но если одна из них не заработает, то выбирайте вторую).

После сохранения файла попробуйте запустить консоль ещё раз, всё должно заработать.

Проблемы с кодировкой кириллицы в WordPad

Текстовым редактором WordPad также можно починить файл. Делается это идентично способу с блокнотом. Опять надо файл “Сохранить как…”, однако выбор кодировки здесь не задан отдельно, как в блокноте, а вынесен в “Тип файла”.

Нам нужно выбрать тип “Текстовый документ в Юникоде” и таким образом сохранить файл.

Проблемы с кодировкой кириллицы в консоли. Смена кодировки - vscode.ru

Проблемы с кодировкой кириллицы в Visual Studio

Вариант 1. Изменение кодировки файла.

Если ваш файл открыт у вас в Visual Studio, то для смены кодировки нужно выполнить следующие действия: В рабочей среде кликнуть на вкладке файла:

Проблемы с кодировкой кириллицы в консоли. Смена кодировки - vscode.ru

Затем перейди в меню “Файл” -> “Дополнительные параметры сохранения..”.

В появившемся окне смотрим огромный список с названием “Кодировка” и выбираем там Юникод:

Проблемы с кодировкой кириллицы в консоли. Смена кодировки - vscode.ru

После нажимаем “ОК”, и всё готово!

Вариант 2. Изменение кодировки программно.

Кроме того, в Visual Studio можно легко поменять кодировку файла в самом коде. Делается это, на примере работы с классом StreamReader, вот так:

Весь исходный код статьи доступен на GitHub:

CharAndString/CharOpportunities

Минимальное и максимальное значение char

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

Категории символов

Для того, чтобы знать, что именно из себя представляет символ можно использовать статический метод GetUnicodeCategory() , который возвращает элемент перечисления UnicodeCategory . Например:

С полным списком возможных значений можно ознакомиться в подсказках IntelliSense или в Microsoft Docs.

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

Преобразование регистра символа с учетом и без учета региональных стандартов

Мы без проблем можем преобразовывать друг в друга соответствующие строчные и заглавные буквы. Для этого можно использовать две пары методов: ToLowerInvariant() и ToUpperInvariant() , ToLower() и ToUpper() . Разница между ними в том, что в первом случае преобразование символа будет выполняться без учета региональных стандартов. Во втором случае по умолчанию будет использоваться набор региональных стандартов, получаемых из свойств вызывающего потока. Либо мы можем самостоятельно передать необходимый параметр CultureInfo . В некоторых случаях это может повлиять на результат преобразования.

Результат выполнения операций приведения в данном случае будет отличаться. В первом случае мы получим латинскую прописную букву I ( \u0049 ), а во втором – латинская прописная буква İ с надстрочной точкой ( \u0130 ).

Экземплярные методы char

Нам также предоставляется возможность использовать несколько стандартных экземплярных методов при работе с символами. Например, мы можем выполнять сравнение с помощью метода Equals() , который проверяет соответствие именно кодов символов, а не их внешнее сходство.

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

По этому поводу мне разу же вспомнился прикол, связанный с волшебным языком программирования JavaScript. Там есть отличная возможность немного поднасрать другу на работе, заменив обычный символ вычитания ‘-‘ ( \u002D ) на очень похожий на него специальный символ ‘ ’ ( \u1680 ). А так как JS – это страна чудес, и интерпретатор благополучно пропускает любую дичь, то мы можем получить вот такую магию… И ни одного предупреждения об ошибке!

Если не верите, то можете самостоятельно прямо сейчас открыть консоль Google Chrome и ввести эти команды. А потом у меня спрашивают, за что я не люблю JS…

Также мы можем выполнять сравнение символов, так как char реализует интерфейсы IComparable и IComparable . При этом сравнение выполняется без учета региональных стандартов, поэтому можно не опасаться, это может повлиять на результаты. Сравниваются именно числовые коды символов.

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

Взаимное преобразование строки и символа

У нас есть возможность выполнять преобразование строки из одного символа в символ и наоборот, символа в строку из одного символа. В первом случае используются методы Parse() и TryParse() , во втором – ToString() .

Для того, чтобы избегать выбрасывания исключения при попытке приведения строки к символу лучше всего использовать более безопасную версию метода TryParse() .

Важной особенностью является то, что возвращаемое значение у обоих этих методов использует кодировку UTF-16, из-за чего может возникать избыточное использование памяти. Благо компилятор обычно без проблем справляется с этой особенностью, поэтому ничего специально менять не нужно.

При преобразовании символа в cтроку все достаточно просто и безопасно, никаких дополнительных проверок выполнять не нужно.

Преобразование символа в числовое значение

Так как цифры и некоторые числа тоже могут быть символами у нас должна быть возможность получать цифровые значения. Для этого мы можем воспользоваться методом GetNumericValue() .

Обратите внимание, что данный метод возвращает тип double , а если в качестве аргумента передается не числовой символ, то возвращается значение -1.

Результат выполнения этого метода кардинально отличается от простого приведения символа к int , так как при приведении, по сути, просто возвращается десятичный код символа.

Преобразование числа в символ и наоборот

Существует несколько способов преобразования числа в символ и в обратном направлении. При этом некоторые будут работать быстрее, чем другие. Давайте разберем их в порядке ухудшения.

Приведение типа – самый простой и эффективный способ, так как компилятору не нужно использовать дополнительные IL-команды для вызова методов. Мы с легкостью можем привести int к соответствующему этому коду символу. Приведение может быть как проверяемым, так и непроверяемым ( checked или unchecked по умолчанию).

Тип Convert – мы можем использовать специализированный для приведения класс Convert , который содержит в себе несколько статических перегруженных методов для работы с char . За счет этого упаковка выполняться не будет, но дополнительные IL-команды для вызова методов будут сгенерированы компилятором. В данном случае операции могут быть только проверяемые.

Интерфейс IConvertible – как и многие другие структуры FCL, char явно реализует интерфейс IConvertible , что позволяет выполнять приведение типов. Но так как char – это структура, то при работе через интерфейсную переменную будет выполняться упаковка, что негативно скажется на потреблении ресурсов системы и производительности приложения. Операции также будут проверяемыми.

Важно помнить, что так как методы интерфейса IConvertible реализованы явно, то напрямую в переменной они недоступны. Необходимо сначала выполнить приведение к интерфейсной переменной и только после этого соответствующие методы ToInt32() и ToChar() станут доступны для использования.

В качестве аргумента данные методы принимают IFormatProvider , с помощью которого можно передавать региональные стандарты. Но зачастую в этом нет необходимости, поэтому можно просто передавать null .

В случае же если выполнить преобразование невозможно, например, привести переменную char к bool , то будет генерироваться исключение InvalidCastException .

Рассмотрим все эти способы приведения и их особенности на примере:

Читайте также: