Nginx: Как преобразовать кодировку почтовых данных из UTF-8 в TIS-620, прежде чем передавать их через прокси - PullRequest
0 голосов
/ 04 июня 2018

Я хотел бы преобразовать данные POST, полученные из запроса, и преобразовать их из UTF-8 в TIS-620, прежде чем передать их в бэкэнд через proxy_pass, используя приведенный ниже код, но я не уверен, какой способ это сделать

location / {
   proxy_pass http://targetwebsite;
}

Если я не ошибаюсь, я считаю, что должен использовать Lua module для манипулирования запросом, но я не знаю, поддерживают ли они какое-либо преобразование символов.

Может ли кто-нибудь помочь мнес примером кода для преобразования данных POST из UTF-8 в TIS-620 с использованием LUA и как проверить, являются ли данные POST UTF-8 перед их преобразованием или есть ли другой лучший способ манипулирования / преобразования данных POST в nginx?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Это решение работает на Lua 5.1 / 5.2 / 5.3

local function utf8_to_unicode(utf8str, pos)
   -- pos = starting byte position inside input string
   local code, size = utf8str:byte(pos), 1
   if code >= 0xC0 and code < 0xFE then
      local mask = 64
      code = code - 128
      repeat
         local next_byte = utf8str:byte(pos + size)
         if next_byte and next_byte >= 0x80 and next_byte < 0xC0 then
            code, size = (code - mask - 2) * 64 + next_byte, size + 1
         else
            return
         end
         mask = mask * 32
      until code < mask
   elseif code >= 0x80 then
      return
   end
   -- returns code, number of bytes in this utf8 char
   return code, size
end

function utf8to620(utf8str)
   local pos, result_620 = 1, {}
   while pos <= #utf8str do
      local code, size = utf8_to_unicode(utf8str, pos)
      if code then
         pos = pos + size
         code =
            (code < 128 or code == 0xA0) and code
            or (code >= 0x0E01 and code <= 0x0E3A or code >= 0x0E3F and code <= 0x0E5B) and code - 0x0E5B + 0xFB
      end
      if not code then
         return utf8str  -- wrong UTF-8 symbol, this is not a UTF-8 string, return original string
      end
      table.insert(result_620, string.char(code))
   end
   return table.concat(result_620)  -- return converted string
end

Использование:

local utf8string = "UTF-8 Thai text here"
local tis620string = utf8to620(utf8string)
0 голосов
/ 04 июня 2018

Я посмотрел кодировку в Википедии и нашел следующее решение для преобразования из UTF-8 в TIS-620.Предполагается, что все кодовые точки в строке UTF-8 имеют кодировку в TIS-620.Это будет работать, если строка UTF-8 содержит только печатные символы ASCII (кодовые точки " " до "~") или тайские символы (кодовые точки "ก" до "๛").В противном случае это даст неправильные и, возможно, очень странные результаты.

Это предполагает, что у вас есть библиотека Lua 5.3 utf8 или эквивалентная.Если вы используете более раннюю версию Lua, одна из возможностей - это pure-Lua версия библиотеки ustring от MediaWiki (используемой, например, Wikipedia и Wiktionary).Он предоставляет функцию для проверки UTF-8, и многие другие функции будут проверять строки автоматически.(То есть они выдают ошибку, если строка недопустима в формате UTF-8.) Если вы используете эту библиотеку, вам просто нужно заменить utf8.codepoint на ustring.codepoint в приведенном ниже коде.

-- Add this number to TIS-620 values above 0x80 to get the Unicode codepoint.
-- 0xE00 is the first codepoint of Thai block, 0xA0 is the corresponding byte used in TIS-620.
local difference = 0xE00 - 0xA0

function UTF8_to_TIS620(UTF8_string)
    local TIS620_string = UTF8_string:gsub(
      '[\194-\244][\128-\191]+',
      function (non_ASCII)
          return string.char(utf8.codepoint(non_ASCII) - difference)
      end)
    return TIS620_string
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...