我想转换从请求收到的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?
答案 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