Lua, XML, UTF-8 - PullRequest
       36

Lua, XML, UTF-8

3 голосов
/ 29 декабря 2010

Я использую luaxml lib для генерации XML-файлов после выбора базы данных из таблиц lua. Все хорошо, но я использую русские символы в моей БД (NySQL). Что мне нужно сделать с luaxml для представления этих символов не с кодами (а-ля Р), а с реальными символами. Я нашел метод function xml.registerCode (декодированный, закодированный), но ничего не понимаю: (

Или, может быть, мне нужно использовать другую библиотеку. И если да, то какая библиотека?

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Если заглянуть внутрь LuaXML_lib.c, есть метод char2code (), который заменяет символы, не входящие в диапазон ASCII, числовыми объектами.Вы можете «разорвать» его, заменив метод следующим:

static const char* char2code(unsigned char ch, char buf[2]) {
    buf[0]=ch;
    buf[1]=0;
    return buf;
}

Это не позволит заменить любые недопустимые символы на сущности.После этого вам нужно будет убедиться, что в ваших входных данных нет недопустимых символов, но это определенно больше не повлияет на ваш UTF-8.

0 голосов
/ 23 сентября 2014

Я заглянул внутрь библиотеки - она ​​выполняет принудительное кодирование для всех> 127 байт, тем самым разбивая UTF на отдельные символы.Он делает это после использования встроенного механизма .registerCode, поэтому вы даже не можете его переопределить.

Если вам нужно закодировать некоторую сложную структуру данных, вы можете просто развернуть все эти замены сущностей после XmlLua закончил строковое преобразование, объявив где-то:

local high_ascii_unroll = {}
for code = 128, 255 do
    high_ascii_unroll['&#' .. code .. ';'] = string.char(code)
end

и затем используя gsub в итоговой строке:

local doc = xml.new("outer")
doc.version = "2.0"
local inner = xml.new("inner")
inner.id = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫьЭЮЯ"
table.insert(doc, inner)

local encoded = xml.str(doc):gsub('&#%d+;', high_ascii_unroll)
-- <outer version="2.0">
--  <inner id="АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫьЭЮЯ" />
-- </outer>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...