Программирование в Linux и C: Как я могу записать кодированный в UTF-8 текст в файл? - PullRequest
1 голос
/ 10 февраля 2009

Я заинтересован в записи строк в кодировке utf-8 в файл.

Я сделал это с низкоуровневыми функциями open () и write (). Во-первых, я установил локаль на набор символов с поддержкой utf-8 с помощью setlocale("LC_ALL", "de_DE.utf8"). Но полученный файл не содержит символов utf-8, только умляуты в кодировке iso8859. Что я делаю не так?

Приложение: я не знаю, действительно ли мои строки действительно кодируются в формате utf-8. Я просто храню их в исходном файле в таком виде: char *msg = "Rote Grütze";

См. Скриншот для содержимого текстового файла: альтернативный текст http://img19.imageshack.us/img19/9791/picture1jh9.png

Ответы [ 3 ]

2 голосов
/ 10 февраля 2009

Изменение языкового стандарта не изменит фактические данные, записанные в файл с помощью write (). Вы действительно должны произвести UTF-8 символов, чтобы записать их в файл. Для этого вы можете использовать библиотеки как ICU .

Изменить после редактирования вопроса : символы UTF-8 отличаются от ISO-8859 только «специальными» символами (ümlauts, áccénts и т. Д.). Таким образом, для всего текста, который не имеет ни одного из этих символов, оба являются эквивалентными. Однако, если вы включаете в свою программу строки с этими символами, вы должны убедиться, что ваш текстовый редактор обрабатывает данные как UTF-8. Иногда вам просто нужно сказать это.

Подводя итог, вы получите текст в формате UTF-8, если строки в исходном коде в формате UTF-8.

Другое редактирование : Просто чтобы быть уверенным, вы можете преобразовать свой исходный код в UTF-8, используя iconv:

iconv -f latin1 -t utf8 file.c

Это преобразует все ваши строки из латиницы-1 в utf8, и когда вы их напечатаете, они точно будут в UTF-8. Если iconv встречает странный символ или вы видите выходные строки со странными символами, значит, ваши строки уже были в UTF-8.

С уважением,

1 голос
/ 10 февраля 2009

Да, вы можете сделать это с помощью glibc. Они называют его многобайтовым вместо UTF-8, потому что он может обрабатывать более одного типа кодировки. Ознакомьтесь с этой частью руководства.

Найдите функции, которые начинаются с префикса mb, а также функции с префиксом wc, для преобразования из многобайтового в широкий символ Сначала вам нужно будет установить локаль с помощью setlocale () в UTF-8, чтобы он выбрал эту реализацию многобайтовой поддержки.

Если вы пришли из файла Unicode, я считаю, что вам нужна функция wcstombs ().

0 голосов
/ 10 февраля 2009

Можете ли вы открыть файл в шестнадцатеричном редакторе и проверить, с помощью простого примера ввода, что записанные байты не являются значениями символов Unicode, которые вы передали в write (). Иногда текстовый редактор не может определить набор символов, и ваш текстовый редактор мог принять набор символов ISO8859-1.

Как только вы это сделаете, можете ли вы отредактировать исходное сообщение, добавив соответствующую информацию?

...