2016-12-24 4 views
6

Если взять длину строки, содержащей символ за пределами 7-битного ASCII таблицы, я получаю разные результаты на ОС Windows и Linux:C Строка кодирующая Windows/Linux

Windows: strlen("ö") = 1 
Linux: strlen("ö") = 2 

На машине Windows, строковое явно закодирован в «расширенном» формате ascii как 0xF6, тогда как на машине Linux он кодируется в UTF-8 с 0xC3 0x96, что дает длину 2 символа.

Вопрос:

Почему строка C получает по-разному закодирован на Windows, и Linux машине?


Встал вопрос в дискуссии, я имел с участником форума собрата по обзору Кодекса (see this thread).

+0

Являются ли оба исходных файла одинаковыми с кодировкой и спецификацией? – sidyll

+1

Похоже, что кодировка может быть выбрана из локальных настроек. И, похоже, вы тоже можете установить его? https://gcc.gnu.org/onlinedocs/cpp/Invocation.html (-fwide-exec-charset = charset) – Sush

+0

Потому что в Windows CP-1252 по умолчанию, и есть некоторые проблемы с UTF-8, когда Microsoft хочет поддерживать обратную совместимость. См. Это в SU [Windows 7 UTF-8 и Unicode] (// superuser.com/q/221593) – Danh

ответ

5

Почему строка C по-разному кодируется на компьютере под управлением Windows и Linux?

Во-первых, это не Windows/Linux (операционные системы) проблема, но компилятор один, как существуют компиляторы на Windows, которые кодируют как НКУ (обычно на Linux).

Это позволяется C и два производители компиляторов наметил различные реализации на своих собственных целей программирует, MS с помощью CP-1252 и Linux с помощью Unicode. @Danh. Предварительные даты выбора MS Unicode. Не удивительно, что различные производители компиляторов используют разные решения.

5.2.1 Наборы символов
1 Два набора символов и ассоциированные с ними последовательности упорядочения должны быть определено: множество, в котором источником фи ле написаны (The исходный набор символов), и множество интерпретированы в среде исполнения (набор символов ). Каждый набор далее делится на базовый набор символов , содержимое которого дается в этом подпункте, и набор из нуля или более элементов определения языка (которые не являются членами базового набора символов), которые называются расширенные символы , Комбинированный набор также называется расширенным набором символов . Значениями элементов набора символов выполнения являются: . Реализация -. C11dr §5.2.1 1 (курсив мой)

strlen("ö") = 1 
strlen("ö") = 2 

"ö" кодируется в исходного символа компилятора расширенные символы.

Я подозреваю, что MS сосредоточена на поддержании своей базы кода и поощряет другие языки. Linux - это просто более ранний адаптер Unicode на C, хотя MS был ранним юникодом-влиятелем.

Как Unicode support grows, я ожидаю, что это решение будущего.

+0

C и UTF-8, кошмар. Надеемся, что C добавит поддержку UTF-8 в будущем. Если C хочет продолжать жить, он должен измениться. http://julialang.org/utf8proc не прост в использовании. – Stargateur

+1

@Stargateur Согласитесь с ночной кобылой. Проблема в том, что C не поддерживает поддержку UTF-8 - это относительно легко - она ​​существует с C11. (См. _6.4.5 Строковые литералы_, такие как 'u8« Hellö »'), но поддерживающий/обесценивающий предшествующий расширенный характер приближается бок о бок, которые падают со стороны. Ведь C все еще имеет орграфы/триграфы: устаревшее решение проблем, связанных с языком. Это займет десятилетия. – chux

+0

Спасибо за ответ! Я использую gcc на обеих системах версии 4.8.1 на окнах и 4.8.4 на linux с теми же параметрами (-O0 -g3 -Wall -c -fmessage-length = 0). Я немного поиграю с вариантами, предложенными Сушем. –

Смежные вопросы