Замените ударные символы в строке на стандартные с LUA - PullRequest
0 голосов
/ 22 мая 2018

** ЭТА ОШИБКА СМОТРЕТЬ, КАК В ЕДИНСТВЕ ЖУТКА.КОД, КАК РАБОТАТЬ, ВНЕШНЕЕ РАБОТАЕТ ВНЕ ВНЕШНИХ ВИДЕОСИЛИТЕЛЕЙ (ИГРА, КОТОРАЯ МОДИРУЕТ)

Я отмечаю это как решенное, но оставляю моды на удаление, если необходимо, так как код все еще может быть полезен для другихлюди гуглят.**

Я пытаюсь обработать большую строку из нескольких строк ... и хотел бы, чтобы все найденные символы акцентирования были преобразованы в стандартные символы.У меня есть некоторый код, который я получил из сети для этого, но есть небольшая ошибка в коде, и я не понимаю, как это работает, поэтому вам нужна помощь по этому вопросу, если вы можете.

function stripChars(str)
    local tableAccents = {}
        tableAccents["à"] = "a"
        tableAccents["á"] = "a"
        tableAccents["â"] = "a"
        tableAccents["ã"] = "a"
        tableAccents["ä"] = "a"
        tableAccents["ç"] = "c"
        tableAccents["è"] = "e"
        tableAccents["é"] = "e"
        tableAccents["ê"] = "e"
        tableAccents["ë"] = "e"
        tableAccents["ì"] = "i"
        tableAccents["í"] = "i"
        tableAccents["î"] = "i"
        tableAccents["ï"] = "i"
        tableAccents["ñ"] = "n"
        tableAccents["ò"] = "o"
        tableAccents["ó"] = "o"
        tableAccents["ô"] = "o"
        tableAccents["õ"] = "o"
        tableAccents["ö"] = "o"
        tableAccents["ù"] = "u"
        tableAccents["ú"] = "u"
        tableAccents["û"] = "u"
        tableAccents["ü"] = "u"
        tableAccents["ý"] = "y"
        tableAccents["ÿ"] = "y"
        tableAccents["À"] = "A"
        tableAccents["Á"] = "A"
        tableAccents["Â"] = "A"
        tableAccents["Ã"] = "A"
        tableAccents["Ä"] = "A"
        tableAccents["Ç"] = "C"
        tableAccents["È"] = "E"
        tableAccents["É"] = "E"
        tableAccents["Ê"] = "E"
        tableAccents["Ë"] = "E"
        tableAccents["Ì"] = "I"
        tableAccents["Í"] = "I"
        tableAccents["Î"] = "I"
        tableAccents["Ï"] = "I"
        tableAccents["Ñ"] = "N"
        tableAccents["Ò"] = "O"
        tableAccents["Ó"] = "O"
        tableAccents["Ô"] = "O"
        tableAccents["Õ"] = "O"
        tableAccents["Ö"] = "O"
        tableAccents["Ù"] = "U"
        tableAccents["Ú"] = "U"
        tableAccents["Û"] = "U"
        tableAccents["Ü"] = "U"
        tableAccents["Ý"] = "Y"
    local normalizedString = ''

    for strChar in string.gmatch(str, "([%z\1-\127\194-\244][\128-\191]*)") do
        if tableAccents[strChar] ~= nil then
            normalizedString = normalizedString..tableAccents[strChar]
        else
            normalizedString = normalizedString..strChar
        end
    end
 return normalizedString
end

Этот код, кажется, работает очень хорошо, но он не работает для символов типа u ... так что ...

local test = "ù, ú, û, ü"
print(stripChars(test)) -- Prints (,,,)
test = "à, á, â, ã, ä"
print(stripChars(test)) -- Prints (a, a, a, a, a)

Есть идеи? .. Я предполагаю, что это как-то связано с шаблономвещь .. но я не вижу, как именно это работает в 1-м месте.(см. нижнюю часть блока кода под большой таблицей символов)

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

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

function stripChars(str)
  local tableAccents = {}
    tableAccents["À"] = "A"
    tableAccents["Á"] = "A"
    tableAccents["Â"] = "A"
    tableAccents["Ã"] = "A"
    tableAccents["Ä"] = "A"
    tableAccents["Å"] = "A"
    tableAccents["Æ"] = "AE"
    tableAccents["Ç"] = "C"
    tableAccents["È"] = "E"
    tableAccents["É"] = "E"
    tableAccents["Ê"] = "E"
    tableAccents["Ë"] = "E"
    tableAccents["Ì"] = "I"
    tableAccents["Í"] = "I"
    tableAccents["Î"] = "I"
    tableAccents["Ï"] = "I"
    tableAccents["Ð"] = "D"
    tableAccents["Ñ"] = "N"
    tableAccents["Ò"] = "O"
    tableAccents["Ó"] = "O"
    tableAccents["Ô"] = "O"
    tableAccents["Õ"] = "O"
    tableAccents["Ö"] = "O"
    tableAccents["Ø"] = "O"
    tableAccents["Ù"] = "U"
    tableAccents["Ú"] = "U"
    tableAccents["Û"] = "U"
    tableAccents["Ü"] = "U"
    tableAccents["Ý"] = "Y"
    tableAccents["Þ"] = "P"
    tableAccents["ß"] = "s"
    tableAccents["à"] = "a"
    tableAccents["á"] = "a"
    tableAccents["â"] = "a"
    tableAccents["ã"] = "a"
    tableAccents["ä"] = "a"
    tableAccents["å"] = "a"
    tableAccents["æ"] = "ae"
    tableAccents["ç"] = "c"
    tableAccents["è"] = "e"
    tableAccents["é"] = "e"
    tableAccents["ê"] = "e"
    tableAccents["ë"] = "e"
    tableAccents["ì"] = "i"
    tableAccents["í"] = "i"
    tableAccents["î"] = "i"
    tableAccents["ï"] = "i"
    tableAccents["ð"] = "eth"
    tableAccents["ñ"] = "n"
    tableAccents["ò"] = "o"
    tableAccents["ó"] = "o"
    tableAccents["ô"] = "o"
    tableAccents["õ"] = "o"
    tableAccents["ö"] = "o"
    tableAccents["ø"] = "o"
    tableAccents["ù"] = "u"
    tableAccents["ú"] = "u"
    tableAccents["û"] = "u"
    tableAccents["ü"] = "u"
    tableAccents["ý"] = "y"
    tableAccents["þ"] = "p"
    tableAccents["ÿ"] = "y"

  local normalisedString = ''

  local normalisedString = str: gsub("[%z\1-\127\194-\244][\128-\191]*", tableAccents)

  return normalisedString

end
0 голосов
/ 22 мая 2018

Я не знаю, почему функция будет работать на "à, á, â, ã, ä", но удалит символы при использовании на "ù, ú, û, ü".Функция предполагает, что обе строки закодированы в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...