HTTP GET китайский иероглиф, используя luasocket
Я использую luasocket для получения веб-страницы, которая содержит китайские символы "开奖结果" (сама страница кодируется в charset="gb2312"), как показано ниже:
require "socket"
host = '61.129.89.226'
fileformat = '/fcopen/cp_kjgg_dfw.jsp?lottery_type=ssq&lottery_issue=%s'
function getlottery(num)
c = assert(socket.connect(host, 80))
c:send('GET ' .. string.format(fileformat, num) .. " HTTP/1.0\r\n\r\n")
content = c:receive('*l')
while content do
if content and content:find('开奖结果') then -- failed
print(content)
end
content = c:receive('*l')
end
c:close()
end
--http://61.129.89.226/fcopen/cp_kjgg_dfw.jsp?lottery_type=ssq&lottery_issue=2012138
getlottery('2012138')
К сожалению, он не соответствует ожидаемым символам:
content:find('开奖结果') -- failed
Я знаю, что Lua способен находить символы Юникода:
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> if string.find("This is 开奖结果", "开奖结果") then print("found!") end
found!
Тогда, я думаю, это может быть связано с тем, как luasocket извлекает данные из Интернета. Может ли кто-нибудь пролить свет на это?
Благодарю.
1 ответ
Решение
Если страница закодирована в GB2312, а ваш скрипт (сам файл) закодирован в utf-8, совпадение не будет работать. Так как .find()
будет искать кодовые точки utf-8 и будет просто скользить по символам, которые вы ищете, потому что они не закодированы одинаково...
开 奖 结 果
GB bfaa bdb1 bde1 b9fb
UTF-16 5f00 5956 7ed3 679c
UTF-8 e5bc80 e5a596 e7bb93 e69e9c