1

В настоящее время я учусь в университете и изучаю информатику, и во время нашего сетевого теста мне был задан интересный вопрос в нашей книге.

Допустим, компьютер был создан до того, как был изобретен Unicode, теперь уровень представления получает этот Unicode, но он находится за пределами возможного диапазона интерпретации, что произойдет с этими данными, отправленными на этот компьютер? Как он представит эту информацию?

1 ответ1

5

Это зависит от конкретной программы. Большинство из них сделает все возможное.

В компьютере нет единого "уровня представления" - это просто довольно неопределенная часть ОС и / или отдельных программ. Каждая программа отличается в том, как вы должны разделить ее на слои (если вообще). И все программное обеспечение на компьютере может быть обновлено для новых функций по мере необходимости.

(Лично я вообще не стал бы уделять слишком много внимания уровням 6–7, за исключением того, что они являются «программным обеспечением, использующим уровень сеанса».)


Также следует понимать, что Unicode является абстрактным стандартом и не передается по сети - программы обычно отправляют и получают определенные кодировки, такие как UTF-8 или UTF-16. Так что у программы, предшествующей Unicode, не было бы проблемы «вне диапазона» из ниоткуда, потому что она не будет интерпретировать полученные байты таким образом.


Презентация обычно состоит из нескольких отдельных задач, поэтому, когда я говорю «программное обеспечение» ниже, оно может каждый раз относиться к другому компоненту. (Например, декодирование UTF-8 во внутреннее представление программы может быть выполнено с помощью libc, макет с помощью Pango, рендеринг шрифтов с помощью FreeType.)

  • Сначала идет декодирование. Так что же делать программе, если она получает сообщение UTF-8, которое она не понимает? Обычно, если он знает, что данные являются текстовыми, он использует своего рода запасную кодировку для их декодирования. Например, если старая программа электронной почты в Интернете видит MIME-тип text/plain; charset=utf-8 , он будет знать, что сообщение является текстовым, и попытается интерпретировать его байты как ISO 8859-1 или Windows-1252, даже если это приведет к появлению мусора.

    (Как это бывает, и UTF-8, и ISO 8859 основаны на ASCII, поэтому многие европейские тексты фактически приводят к декодированию, читаемому на полпути независимо от этого. См. Статью Wikipedia Mojibake для примеров.)

    Тем не менее, это не всегда работает - некоторые форматы строже, чем другие. Например, если документ ASN.1 имеет UnicodeString вместо IA5String, старые программы не будут знать, что это все еще текст или данные другого типа. Поэтому, если корейская компания покупает сертификат SSL, некоторые старые браузеры будут отображать свое имя как «Organization: [unrecognized]».

  • Тогда есть интерпретация. Если программное обеспечение поддерживает более старую версию Unicode и получает текст с кодовыми точками за пределами его известного диапазона, это не проблема, пока они не отобразятся на экране - в этот момент вы увидите символ замены «�» вместо них.

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

    (Недавно было обнаружено, что многие «Unicode-совместимые» программы и веб-сайты используют UCS-2 для внутреннего использования (что соответствует только U+FFFF). Если бы им дали текст в кодировке UTF-16 с кодовыми точками выше этого (например, эмодзи), они интерпретировали бы суррогатные пары UTF-16 как две нераспознанные кодовые точки и показали бы «��» вместо «».)

  • Наконец есть показ. Если программное обеспечение расшифровывает и распознает кодовые точки, но не имеет необходимых шрифтов для символов, то обычно оно также будет отображать заполнитель. Программное обеспечение Linux обычно рисует прямоугольник с крошечными шестнадцатеричными числами в нем (номер кода); macOS использует специальный резервный шрифт взамен; в Windows вы можете получить знаки вопроса в коробке.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .