Работа со строками со смешанными кодировками в python 3.x

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

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

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

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

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


person MxLDevs    schedule 08.02.2012    source источник
comment
Не смешивайте кодировки; используйте utf-8 для всего.   -  person Wooble    schedule 08.02.2012
comment
Это не сработает, если источник, из которого я читаю, не использует utf-8 для всего. У многих других файлов, с которыми я работаю, есть разработчики, которые тоже не используют utf-8 (будь то китайский, японский или корейский).   -  person MxLDevs    schedule 08.02.2012
comment
не работает ли mybytestring.decode ('shift-jis')? shift-jis теоретически совместим с ascii, за исключением возможных символов \ и ~, хотя на самом деле это не стандарт.   -  person gps    schedule 08.02.2012


Ответы (1)


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

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

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

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

person Lennart Regebro    schedule 08.02.2012