Хорошо, это должно быть действительно просто, но я искал ответ повсюду и также прочитал следующую ветку: Как найти длину строки Unicode в Perl?
Это мне не помогает.Я знаю, как заставить Perl обрабатывать строковую константу как UTF-8 и возвращать правильное количество символов (вместо байтов), но почему-то это не работает, когда Perl получает строку через мой вызов AJAX.
Ниже я выкладываю три греческие буквы Альфа, Бета и Омега в юникоде.Perl говорит мне, что длина составляет 6 (байтов), когда он должен сказать мне только 3 (символы).Как получить правильное количество символов?
#!/usr/bin/perl
use strict;
if ($ENV{CONTENT_LENGTH}) {
binmode (STDIN, ":utf8");
read (STDIN, $_, $ENV{CONTENT_LENGTH});
s{%([a-fA-F0-9]{2})}{ pack ('C', hex ($1)) }eg;
print "Content-Type: text/html; charset=UTF-8\n\nReceived: $_ (".length ($_)." chars)";
exit;
}
print "Content-Type: text/html; charset=UTF-8\n\n";
print qq[<html><head><script>
var oRequest;
function MakeRequest () {
oRequest = new XMLHttpRequest();
oRequest.onreadystatechange = zxResponse;
oRequest.open ('POST', '/test/unicode.cgi', true);
oRequest.send (encodeURIComponent (document.oForm.oInput.value));
}
function zxResponse () {
if (oRequest.readyState==4 && oRequest.status==200) {
alert (oRequest.responseText);
}
}
</script></head><body>
<form name="oForm" method="POST">
<input type="text" name="oInput" value="αβΩ">
<input type="button" value="Ajax Submit" onClick="MakeRequest();">
</form>
</body></html>
];
Кстати, код существенно упрощен (я знаю, как сделать кросс-браузерный вызов AJAX и т. Д.), И использование модуля CGI Perl не опция.