LINUX.ORG.RU

Что делать с совместимостью кодировок (UTF8/UTF16)?


0

0

Добрый день.

Раньше использовал, в общем и до сих пор использую, кодировку koi8-r и все бы хорошо, пока не нужна совместимость с одной альтернативной операционной системой. Я умею монтировать виндовые диски, самбовые шары, чтобы все читалось, перекодировать файлы и тп. Речь не об этом.

Решил я, что надо двигаться по пути прогресса и использовать unicode. Пишу именно так, потому что в этом и проблема. Оказывается винда и линукс используют разный уникод. В линуксе у нас UTF8, а в винде UTF16. И друг-друга они часто не понимают!

Началось все с того, что я перекодировал все id3 тэги в своих мп3шках, в utf8. После чего BMP их замечательно воспроизводил и сортировал и все такое. Но, когда я записал файлы другу на диск, выяснилось, что ни один виндовый плеер их читать не может. Вместо буковок пишет кракозябли. Сперва я подумал, что винда на самом деле Уникод не понимает. Но потом, виндузоиды мне объяснили, что мол они юзают "правильный уникод", который UTF16.

Оставим оголтелых в покое, речь сейчас не о них и не о ХолиВарс. Я начал проверять все подряд, начиная с простого именования файлов UTF8 и ничего в винде прочитать не могу. Вот и не знаю теперь. Что делать? Обещанного счастья с unicode, когда все всех понимают нет вовсе, или я просто чего-то не понимаю? Вобщем запутался я.

Итак, что делать? Хочется чтобы имена файлов, тэги, содержимое файлов читались и там и там без лишних бубнов.

P.s. Разницу между UTF8 - 16 - 32 BE/LE я знаю. Прочитал.

★★★★★

С тегами в MP3 бардак, их мало кто нормально поддерживает (по спеку 2.4 или хотя бы 2.3). foobar2000 понимает и utf-8, и utf-16, если теги правильно проставлены (тестовые теги в мп3 допускается делать в ascii/utf-16/utf-8).

Многие другие плееры пишут/читают теги в системной кодировке туда, где по стандарту должно быть ASCII, особенно в id3v1 - поэтому, естественно, ничего не работает; у тебя видимо этот случай. Удали v1 теги, пропиши utf-16 v2.4 "правильной" прогой (последний (версии 2) EasyTag или KDE-шый редактор метаданных - забыл как звать - под линукс, MP3BookHelper под виндой) - будет тебе счастье.

А вообще, юзай ogg - там нет проблем с кодировками, и звучит чуть получше.

С текстовыми файлами хуже, ибо в винде оно подефолту cp1251 для русского, либо ucs2. В принципе, у нормальных редакторов (vim, kwrite, emacs) нет больших проблем ни с тем, ни с другим - хотя автораспознавания может и не оказаться.

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

разве EasyTag пишет 2.4? он сейчас использует id3lib, которая умеет только 2.3.. вот когда перейдут наконец-то на taglib, тогда и будет писать 100% правильно

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

Хм. я пробовал через eyeD3 записывать ID3V3.4 тэг с русскими буквами. винамп/вмп всё равно его не читают. А сами пишут ID3V2.3 в фиг-знает какой кодировке. не разбирался.

То есть всё равно бардак.

UTF-8 и UTF-16 - одинаково "правильные". никакой из них не более/менее правильный.

С содержимым текстовых файлов - зависит от редактора. Я не знаю, какой кодировки не поддерживает Kate

С именами файлов - как правило нет проблем. Главное правильно настроить.

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

>винамп/вмп всё равно его не читают.

Так и есть. Не умеют они этого. iTunes понимает id3v2.4 в UTF-16LE. Про других виндовых не знаю.

artemy
()
Ответ на: комментарий от smartly

> Хм. я пробовал через eyeD3 записывать ID3V3.4 тэг с русскими буквами. винамп/вмп всё равно его не читают. А сами пишут ID3V2.3 в фиг-знает какой кодировке. не разбирался.

Винамп (и еще масса програм) пишет неправильные id3v2.3 - если все буквы есть в системной локали (cp1251), он пишет в (системной, т.е. cp1251) однобайтной кодировке, а в заголовке указывает "ASCII". Читать уникодные теги второй и третий винамп не умеют _вообще_ никак. Надо юзать foobar2000 или iTunes или winamp5, и добиться, чтобы теги были прописаны в utf-16.

> То есть всё равно бардак.

Таки да. А если еще вспомнить, что бывают аппаратные проигрыватели... Правда, в rockbox все нормально с поддержкой уникода, а вот в родной iriver-овской прошивке - баги есть.

anonymous
()
Ответ на: комментарий от artemy

>Так и есть. Не умеют они этого. iTunes понимает id3v2.4 в UTF-16LE. Про других виндовых не знаю.

WMP вроде бы умеет UTF16 LE.

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

Да тут дело уже даже не в тэгах, а в принципе... вроде бы постулировалось, что с переходом на уникод везде все станет одинаково, ан нет. Фигня такая.

>А вообще, юзай ogg - там нет проблем с кодировками, и звучит чуть получше.

:) Перегонять все что у меня есть в Огг очень сильно ломает :( Что касается звучания, то если я "плохо" звучащий мп3 перегоню в Огг, звучать он от этого луче не станет.

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

>UTF-8 и UTF-16 - одинаково "правильные". никакой из них не более/менее правильный.

я-то знаю:)

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

>С именами файлов - как правило нет проблем. Главное правильно настроить.

В рамках моего компьютера проблем и нет. Проблемы возникают когда нужна совместимость. Вопервых мне все время приходится учитывать, что там за кодировки у других людей и это, согласитесь, напрягает. То, что флэшки обычно с cp1251 внутри это еще более менее ок. Но вот записываю СДшку, в каком-нибудь Грэйвмане и все - в винде названия файлов читаются кракозяблями :(

В общем, это такой эээ выброс эмоций. Выход конечно есть, просто очень утомляет, что для каждой отдельной ситуации нужно сделать свой напильничек :)

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

более того, конвертировать из одного lossy формата в другой только ради тэгов, это... кхм-кхм... не то

cursed
()
Ответ на: комментарий от petrosha

>В рамках моего компьютера проблем и нет. Проблемы возникают когда нужна совместимость. Вопервых мне все время приходится учитывать, что там за кодировки у других людей и это, согласитесь, напрягает. То, что флэшки обычно с cp1251 внутри это еще более менее ок. Но вот записываю СДшку, в каком-нибудь Грэйвмане и все - в винде названия файлов читаются кракозяблями :(

Ты плохо настроил. На флешках обычно fat, а на фате имена файлов лежат или в cp866 или в UTF-16. ядро отлично их перекодирует в твою локальную и обрпатно.

с СД-шками - ситуация похожая. на Joilet имена файлов лежат в UTF-16 (или в UCS2, не знаю точно). и перекодирует ядро в локальную нормально.

Вот только при записи если у тебя локальная кодировка UTF-8, то нужно брать mkisofs патченый.

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

> То, что флэшки обычно с cp1251 внутри это еще более менее ок.

Это, согласись, проблема связанная с отсутствием уникода в некоторых местах, да? ;)

> Но вот записываю СДшку, в каком-нибудь Грэйвмане и все - в винде названия файлов читаются кракозяблями :(

А это у тебя кривой mkisofs, как тебе уже сказали.

Проблема с non-unicode однобайтными кодировками в том, что их невозможно со 100% надежностью автоматически определять; и при этом они good enough для достаточно большого количества людей (Latin-1), чтобы существовала _куча_ софта, притворяющегося, что больше ничего не бывает.

anonymous
()
Ответ на: комментарий от smartly

>Ты плохо настроил. На флешках обычно fat, а на фате имена файлов лежат или в cp866 или в UTF-16. ядро отлично их перекодирует в твою локальную и обрпатно.

Можно чуть поподробнее. На флешках действительно фат и для него обычно ставлю codepage=866, а вот utf16 как-то встречать не приходилось. Не 1251, тут я конечно ошибся :)

>с СД-шками - ситуация похожая. на Joilet имена файлов лежат в UTF-16 (или в UCS2, не знаю точно). и перекодирует ядро в локальную нормально.

Да прочитать то правильно записанный СД проблемов нет. Не важно где записано, линукс понимает. И utf8 и utf16. А вот если записано в utf8 то винда не понимает.

>Вот только при записи если у тебя локальная кодировка UTF-8, то нужно брать mkisofs патченый.

Да у меня вообще koi8-r, но после записи почему-то там оказывается utf8. Может конечно писалка кривая, но в любом случае - это только фронтенд к тому же мэйкисофс.

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

>А это у тебя кривой mkisofs, как тебе уже сказали.

У меня как раз не кривой ибо man mkisofs:

>Note that there is no support for 16 bit UNICODE (UTF-16) or 32 bit UNICODE (UTF-32) coding because this coding is not POSIX compliant. There should be support for UTF-8 UNICODE coding which is compatible to POSIX filenames and supported by moder UNIX implementations such as Solaris.

Остается вопрос, где берут "кривой" mkisofs, который понимает utf16?:)

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

>а вот utf16 как-то встречать не приходилось.

Ты просто этого не замечал. Все длинные имена файлов (LFN) на фате лежат в UTF-16. Ядро про это отлично знает и перекодирует в твою локальную и обратно.

Про CD:

Имена файлов в Joilet хранятся в UTF-16! и ни в какой другой. Если ты про RockRidge - там да, там может быть что угодно. Но винда _не_использует_ RockRidge, Вообще никак.

если у тебя локальная кодировка koi8-r - то mkisofs -jcharset=koi8r и вперед. Если локальная - UTF-8 нужно брать mkisofs из редхата или сюзи (может еще где пропатчили).

с рокриджем - будешь иметь геморрой. да.

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

> Да у меня вообще koi8-r, но после записи почему-то там оказывается utf8. Может конечно писалка кривая, но в любом случае - это только фронтенд к тому же мэйкисофс.

Именно писалка. не умеет graveman работать правильно с именами файлов на русском, во всяком случае с кодировкой koi8-r (возможно из-за нелюбви glib к не utf кодировкам). Проверь свой mkisofs, из командной строки создай исошку, режь на болванку и отдай виндузятникам. Если ключи для mkisofs укажешь верно, то русские буквы виндузоиды увидят...

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

Да проверил уже. Прав ты. Грэйвман кривой нах :(

Где взять ГТКшную морду к писалке?

petrosha ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.