2015-02-17 5 views
1

Извините за запутанный заголовок, я не совсем уверен, как это сделать сам. Я постараюсь максимально упростить мой вопрос.Чтение файла с неизвестными строками UTF8 и известным ASCII смешанным

Я работаю над системой, которая хранит «каталог» строк. Этот каталог представляет собой простой текстовый файл, который индексируется определенным образом. Синтаксис файлов должен быть в ASCII, но содержимое строк может быть UTF8.

Пример файла:

{ 
    STRINGS: { 
     THISHASTOBEASCII: "But this is UTF8" 
     HELLO1: "Hello, world" 
     HELLO2: "您好" 
    } 
} 

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

Проблема в том, что мне нужно разобрать скобу и метки строк для правильного хранения строк UTF8 в памяти. Как мне это сделать?

EDIT: Только что я осознал, что я его преувеличиваю. Я должен просто скопировать и сохранить все, что находится между двумя «», так как UTF8 можно прочитать в байтах> _ <. Помечается для закрытия.

+0

Вы можете просто удалить свой вопрос, если вы это уже поняли. Или напишите ответ, если вы считаете, что это будет полезно для других людей. – yellowantphil

+0

Проблема заключается в том, что nt читает их, но обнаруживает замыкающую двойную кавычку, убедившись, что это не элемент многобайтовой кодировки. – Christophe

+1

@Christophe. Вы никогда не получите ASCII '' 'как часть многобайтового символа в UTF-8. – yellowantphil

ответ

2

Вы можете сделать это только в своем методе обработки UTF-8, о котором вы упомянули.

Собственно, один байт символов UTF-8 также следует правилу ASCII.

1 Байт UTF-8 - это как 0XXXXXXX. Для большего количества байтов UTF-8. Суммарные байты начинают с тех, за которой следует нулевой, а затем и другие байты начать с 10.

как 3-байт: 1110XXXX 10XXXXXX 10XXXXXX

5-байт: 111110XX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX

При вы проходите через массив символов, просто проверяйте каждый символ, который вы читаете. Вы будете знать, является ли это ASCII (по & 0x80 получить ложь) или часть Многобайтовыестроки характера (по & 0x80 получить истинные)

Примечание: Весь Юникод 3 байта UTF-8. В Unicode в настоящее время используются 2 допустимых байта (16 бит) и 3-байтовый UTF-8 также 16-значный бит (см. Приведенные выше счетчики «X» I)

+0

Спасибо, это ответили на мой вопрос. Теперь все намного яснее. Я полагаю, что этот вопрос может остаться в стороне от тех, кто борется с той же проблемой. –

+0

UTF-8 изначально определялся как кодирование до 6 байтов, но позже был ограничен 4 байтами [RFC 3629] (https://tools.ietf.org/html/rfc3629) для совместимости с UTF-16. Утверждение, что * «Все юникод являются 3-байтовыми UTF-8» * неверно. В UTF-8 кодировки Unicode ** U + 0000 - U + 007F ** (ASCII) - 1 байт, ** U + 0080 - U + 07FF ** - 2 байта, ** U + 0800 - U + FFFF ** - 3 байта, а ** U + 10000 - U + 10FFFF ** - 4 байта. Это не следует путать с 2-байтовыми кодировками, используемыми UCS-2 или UTF-16. –

+0

@RemyLebeau Спасибо за дополнение. Я имею в виду, что «то же, что» - это биты, которые содержат информацию. Как 1110XXXX 10XXXXXX 10XXXXXX на самом деле имеют 16 бит, несущих информацию. Я реализовал UTF-8 для маленьких инструментов Unicode, эти биты точно сдвинуты на фиксированные два байта. – BigTailWolf

1

ASCII - это подмножество UTF-8 и UTF -8 может обрабатываться с использованием стандартных 8-битных функций синтаксического анализа строк. Таким образом, весь файл может обрабатываться как UTF-8. Просто отделите части, которые вам не нужны.

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