Nginx:如何将帖子数据编码从UTF-8转换为TIS-620,然后再通过代理传递

时间:2018-06-04 09:53:02

标签: nginx lua

我想转换从请求收到的POST数据并将其从UTF-8转换为TIS-620,然后使用下面的代码通过proxy_pass传递给后端,但我不知道采用哪种方式

Epoch 1/1
1/1 [==============================] - 6s 6s/step - loss: nan - acc: 0.0938

如果我没有错,我相信我必须使用Lua module来操纵请求,但我不知道他们是否支持任何字符转换。

有没有人可以帮助我使用LUA将POST数据从UTF-8转换为ET-620,以及如何在转换之前验证POST数据是否为UTF-8,或者是否有其他更好的方法来操作/转换POST数据在nginx?

2 个答案:

答案 0 :(得分:1)

此解决方案适用于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)

答案 1 :(得分:0)

我在Wikipedia上查找了编码,并提出了以下解决方案,用于将UTF-8转换为TIS-620。它假定UTF-8字符串中的所有代码点都具有TIS-620中的编码。如果UTF-8字符串仅包含ASCII可打印字符(代码点" ""~")或泰语字符(代码点"ก""๛"),它将起作用。否则,它将给出错误的,可能非常奇怪的结果。

这假设您拥有Lua 5.3的utf8库或同等库。如果您使用的是Lua的早期版本,则有一种可能性是来自MediaWiki的ustring库的pure-Lua version(例如,由维基百科和维基词典使用)。它提供了验证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