W3C*_*der 4 unicode ajax perl utf-8
好的,这应该非常简单,但我已经搜索了所有答案并阅读了以下主题: 如何在Perl中找到Unicode字符串的长度?
它对我没有帮助.我知道如何让Perl将字符串常量视为UTF-8并返回正确数量的字符(而不是字节),但是当Perl通过我的AJAX调用接收字符串时,它会以某种方式起作用.
下面,我将在unicode中发布三个希腊字母Alpha,Beta和Omega.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>
];
Run Code Online (Sandbox Code Playgroud)
顺便说一下,代码是内部简化的(我知道如何进行跨浏览器的AJAX调用等)并且使用CGI Perl模块不是一个选项.
您在调用之前解码此字符串length
.例如:
use Encode;
my $utf_string = decode_utf8($_); ## parse string to find utf8 octets
print length($utf_string);
Run Code Online (Sandbox Code Playgroud)
来自编码手册:
$ string = decode_utf8($ octets [,CHECK]);
相当于$ string = decode("utf8",$ octets [,CHECK]).由$ octets表示的八位字节序列从UTF-8解码为逻辑字符序列.并非所有八位字节序列都形成有效的UTF-8编码,因此此调用可能会失败.有关CHECK,请参阅处理格式错误的数据.
归档时间: |
|
查看次数: |
609 次 |
最近记录: |