Декодирование строки ASN1 UTF-8

Я работаю над созданием синтаксического анализатора ASN.1 на языке C (используя документ спецификации Ericsson ASN1). Я хочу декодировать тип строки UTF-8, но не могу найти информацию об этом в Интернете, а документ, который я использую, не описывает подробно строку UTF-8. Может ли кто-нибудь предоставить мне код или объяснить, как его расшифровать.

Я новичок в ASN.1.


person user3148326    schedule 08.03.2015    source источник
comment
en.wikipedia.org/wiki/UTF-8 описывает, как UTF-8 кодирует символы и даже есть пример кода на C.   -  person user3386109    schedule 08.03.2015
comment
Я предполагаю, что этот вопрос касается декодирования последовательности UTF8String ASN.1 в массив байтов UTF-8, а не перехода от этих байтов к строке Unicode (то есть тег utf8-decode не совсем подходит). Вы можете это подтвердить? (и если да, то, возможно, уточните в вопросе)   -  person Norman Gray    schedule 09.03.2015
comment
почему у меня -2 рейтинга? что не так с вопросом?   -  person user3148326    schedule 09.03.2015
comment
@user3148326 user3148326 Я думаю, что люди ошибочно принимают ваш запрос информации о типе ASN.1 UTF8String (очень редко) за запрос информации о строке UTF-8 в целом (очень распространенный и легко доступный для поиска в Google).   -  person Reid Rankin    schedule 25.09.2016


Ответы (2)


Если вы пытаетесь разобрать ASN.1, отличным вводным ресурсом является "Руководство для неспециалистов" Калиски (доступно в различных местах в Интернете, в формате HTML и PDF). Однако в этом документе не упоминается тип UTF8String.

Дополнительная информация, которую вам нужно знать, заключается в том, что UTF8String имеет тег 12 (десятичный или 0c в шестнадцатеричном формате), и что он закодирован как последовательность байтов, представляющих строку в кодировке UTF-8.

Таким образом, строка «Hello» будет закодирована как

0c 06 48 65 6c 6c c3 b3

(Кстати, я предполагаю, что «документ спецификации Ericsson ASN1» обсуждает стандарт ASN.1, а не какой-то его вариант.)

person Norman Gray    schedule 08.03.2015
comment
Одна из разочаровывающих вещей в одном из коммерческих наборов инструментов ASN.1, которые я использовал, заключается в том, что он не проверяет, действительно ли кодируемая/декодируемая строка UTF8 является действительной UTF8. UTF8String просто рассматривается как еще одна ОКТЕТНАЯ СТРОКА, которая может представлять любую старую строку байтов. В UTF8 есть правила относительно того, какие байты следуют за какими, поэтому некоторые комбинации байтов недействительны. Было бы хорошо, если бы компиляторы ASN.1 добавили проверки для этого точно так же, как они проверяют любое другое ограничение значения или размера, указанное в схеме ASN.1. Это добавит еще один уровень встроенной проверки контента. - person bazza; 30.08.2015
comment
(не хватило места для комментария). То же самое касается других типов строк, таких как IA5String и т. д. - person bazza; 30.08.2015
comment
Обратите внимание, что если длина закодированной строки > 127, для построения байтов, представляющих эту длину, используются следующие правила: msdn.microsoft.com/en-us/library/windows/desktop/ - person Tails; 14.03.2017
comment
0c (что означает тип UTF8), затем длина (один октет), затем фактические байты UTF8 - person k3a; 23.03.2017

Полное описание UTF-8, позволяющее написать кодировщик и декодер, сведено в таблицу, доступную на странице Википедии:

http://en.wikipedia.org/wiki/UTF-8#Description

person hdante    schedule 08.03.2015
comment
-1 Это почти не имеет отношения к вопросу. Любой может поискать в Google спецификацию UTF-8. Вопрос в том, как эти строки обрабатываются/кодируются в ASN. 1 - person Tersosauros; 20.06.2016