2012-02-08 3 views
0

Я работаю с двоичным файлом, который ссылается на другой файл, используя абсолютные пути. Путь содержит как символы японского, так и ascii.Работа со строками со смешанными кодировками в python 3.x

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

Однако проблема заключается в попытке преобразования строки. Если я укажу кодировку как ascii, она будет терпеть неудачу на японских символах. Если я укажу его как японскую кодировку (shift-jis или что-то еще), он не будет правильно читать английские символы.

Один байт используется для каждого символа ascii, а для каждого японского символа используются два байта.

Что является самым быстрым и чистым способом преобразования этих байтов в строку? Кодировки известны. Будет ли такой же метод работать в более старых версиях python.

+1

Не смешивайте кодировки; используйте utf-8 для всего. – geoffspear

+1

Это не сработает, если источник, который я читаю, не использует utf-8 для всего. У многих других файлов, с которыми я работаю, есть разработчики, которые не используют utf-8 (будь то китайский, японский или корейский). – MxyL

+0

делает использование mybytestring.decode ('shift-jis') не работает? shift-jis теоретически совместим с ascii, отличным от, возможно, \ и ~ символов, даже если он не является стандартом. – gps

ответ

3

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

Строка байтов, которая содержит смешанные кодировки, по определению недействительна в любом из этих кодировок. Если это действительно так, вам придется разбить строку байтов на свои части и декодировать каждую часть по отдельности. В этом случае это, вероятно, означало бы расщепление на разделителях пути, поэтому было бы достаточно легко, но в других случаях это не так. Тем не менее, я серьезно сомневаюсь, что это так, поскольку это будет означать, что ваш источник безумен. Это происходит, но маловероятно. :-)

Если источник дает вам один путь как строку в байтах, то, скорее всего, эта строка использует только одну кодировку. Он может содержать как японские, так и ASCII-символы и по-прежнему использовать одну кодировку. Наиболее распространенными кодировками, которые могут обрабатывать как японский, так и ASCII, являются UTF-8 и UTF-16. Я предполагаю, что ваш источник использует один из них. Фактически, поскольку вы пишете «Один байт используется для каждого символа ascii, а для каждого японского символа используются два байта», вероятно, это UTF-8. Это также может быть Shift JIS, но, похоже, вы уже пробовали это.

Если нет, пожалуйста, объясните, что ваш источник, и укажите примеры строк байтов (в ASCII/HEX), которые вам даны.