Я не знаю, почему функция будет работать на "à, á, â, ã, ä"
, но удалит символы при использовании на "ù, ú, û, ü"
.Функция предполагает, что обе строки закодированы в UTF-8.Возможно, это проблема с кодировкой, но тогда я ожидаю, что в обоих случаях произойдет сбой.Для меня вызов функции на "ù, ú, û, ü"
дает "u, u, u, u"
, как и ожидалось.
Как говорит Кертис F, это может помочь вызвать print(string.byte(test, 1, -1))
для строки, которая не может выяснить, как она работает.закодирован.У меня есть файл, закодированный в UTF-8, поэтому напечатанные значения 195 185 44 32 195 186 44 32 195 187 44 32 195 188
.
Как работает функция, так это то, что "[%z\1-\127\194-\244][\128-\191]*"
- это шаблон, который соответствует одному символу (кодовой точке), закодированному в Кодировка UTF-8 .Каждая кодовая точка занимает от 1 до 4 байтов.Например, шаблон соответствует одному байту, используемому для кодирования символа запятой (","
is "\44"
), или двум двум байтам, которые используются для кодирования букв с акцентом ("ù"
is "\195\185"
).Цикл for просматривает каждый символ в таблице tableAccents
, где ключи - это буквы с акцентом, а значения - это соответствующие символы без акцента (tableAccents["ù"]
→ "u"
).Если символ является ключом в таблице, значение для этого ключа добавляется к normalizedString
.Если символ не является ключом в таблице, он добавляется без изменения.Таким образом, буквы с акцентом заменяются на символы без акцента, тогда как другие символы остаются одни.
Это всего лишь предложение по очистке кода: цикл for можно упростить с помощью string.gsub
:
local normalizedString = str:gsub("[%z\1-\127\194-\244][\128-\191]*", tableAccents)