如何通过Ajax或CGI获取Perl Unicode字符串输入的长度?

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="&#x03B1;&#x03B2;&#x03A9;">
            <input type="button" value="Ajax Submit" onClick="MakeRequest();">
        </form>
    </body></html>
];
Run Code Online (Sandbox Code Playgroud)

顺便说一下,代码是内部简化的(我知道如何进行跨浏览器的AJAX调用等)并且使用CGI Perl模块不是一个选项.

Iva*_*uev 8

您在调用之前解码此字符串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,请参阅处理格式错误的数据.

  • 为Unicode问题寻求非模块化解决方案就像是在不使用肺部的情况下询问如何呼吸. (5认同)