LINUX.ORG.RU

Qt 4, Qt 5 - Как узнать системную кодировку (UTF-8, KOI8-R, CP1251 ...) ?

 ,


0

1

Здравствуйте!

Пишу кроссплатформенный проект. Мне нужно узнать системную кодировку. То есть:

- В Linux с UTF8 - знать, что кодировка «utf-8»;
- В Linux/BSD с KOI8-R - знать, что кодировка «koi8-r»;
- В Windows с CP1251 - знать, что кодировка «cp1251».

Вот как это узнать? Пытался через QLocale, но там нет методов получения кодировки, там можно только получить язык и языковые настройки.

А как узнать системную кодировку, причем сделать это кроссплатформенно?

★★★★★
Ответ на: комментарий от ziemin

Ну и в какой переменной окружения в винде указывается кодировка?

Да, и еще я забыл еще про Андроид.

Xintrea ★★★★★
() автор топика

А какую задачу ты решаешь? Зачем вообще знать кодировку?

Reset ★★★★★
()

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

EXL ★★★★★
()

А может всё сделать в UTF-8 и пусть пользователи сами сношаются.

А вообще советовал бы тебе создать модуль с функцией определения кодировки и в каждой ОС использовать свой.

rezedent12 ☆☆☆
()

В Linux с UTF8 - знать, что кодировка «utf-8»;

читай man 7 locale

помни, что в общем случае, у каждого юзера своя локаль. Мало того, юзер может запускать твою программу например в украинской локали, хотя у него русская. При этом твоя программа должна работать «по-украински».

В других системах — я не в курсе.

emulek
()

Qt по-умолчанию для всех операций использует системную кодировку, если иная не задана через setCodec.

Y ★★
()
Ответ на: комментарий от EXL

Да, my bad.

Тогда только locale().name или boost.

E ★★★
()

Мне нужно узнать системную кодировку.

ИМХО вопрос в данной постановке имеет смысл только для Windows.

asaw ★★★★★
()

Одно дело узнать имя системной кодировки, другое дело — получить возможность перекодировать (из неё в какую-либо известную кодировку и обратно).

nl_langinfo(CODESET) для Linux (SUSv2, POSIX) и GetCPInfoEx(CP_ACP,...) для Windows (Win2k+) позволяют узнать «имя» (или номер кодовой страницы). Упомянутый выше QTextCodec::codecForLocale позволяет в эту кодировку перекодировать (с сохранением кросс-платформенности).

Лучше включать в такие вопросы пояснение, зачем это вам нужно (не обязательно в деталях, просто добавить чуточку контекста задачи). К примеру, на Windows «системная кодировка» может вообще быть не нужна, за исключением случая, когда юзер подсовывает вам текстовый файл и явно просит, чтобы его раскодировали в ANSI code page.

LeninGad
()
Ответ на: комментарий от Y

Не знаю как 5-й qt, а вот 4-й на убунте (с русской локализацией) что-то не правильно себя вел с кириллицей, приходилось принудительно указывать utf8

RiseOfDeath ★★★★
()
Последнее исправление: RiseOfDeath (всего исправлений: 1)
Ответ на: комментарий от LeninGad

пояснение, зачем это вам нужно

Есть программа на Qt.


1. Мне нужно корректно работать с именами файлов в любой ОС, даже если имя и путь к файлу содержат национальные символы.

Ограничиваюсь только UTF8 (с ней то проблем нет) и однобайтовыми кодировками.

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

Поэтому мне и нужно узнавать системную кодировку. Или, правильнее будет кодировку файловой системы?


2. У меня есть окно, которое выводит сообщения стандартного потока запущенной в отдельном процессе программы. Эдакий примитивный эмулятор терминала, который только показывает стандартный вывод. Он выводит данные в кодировке UTF8.

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

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от Xintrea

То есть, например, если имя пользователя под виндой задано по-русски, то чтобы достучаться до пользовательского каталога, и создать там конфиг-файл, надо корректно работать с CP866.

http://qt-project.org/doc/qt-5.0/qtcore/qstandardpaths.html
http://qt-project.org/doc/qt-4.8/qsettings.html

То есть, перед тем как вывести символы в терминал, их нужно преобразовать из системной кодировки в UTF8.

http://qt-project.org/doc/qt-4.8/qstring.html#toUtf8

wota ★★
()
Последнее исправление: wota (всего исправлений: 1)
Ответ на: комментарий от RiseOfDeath

Это для строк в исходниках, наверное.

А я о кодировке, используемой при чтении/записи файлов.

Y ★★
()
Ответ на: комментарий от Y

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

RiseOfDeath ★★★★
()
Последнее исправление: RiseOfDeath (всего исправлений: 2)
Ответ на: комментарий от RiseOfDeath

Это объясняется тем, чточто программа, написанная на Qt (Qt Creator) в системе, где UTF-8 — основная кодировка при чтении файлов (исходников и форм) использует UTF-8, а компилятор интерпретирует строки в исходнике по-умолчанию как ASCII/Latin1. Тут необходимо указать (в Qt4 с помощью setCodecForCStrings (и, если вы используете tr, с setCodecForTr)), в какой кодировке они присутствуют в исходинке. [snob_mode]Но хорошим тоном будет не использовать не-ASCII символы в исходном коде и пользоваться файлами перевода, благо Qt предоставляет удобные средства для работы с ними.[/snobe_mode]

Y ★★
()
Последнее исправление: Y (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.