【问题标题】:Special characters with extra characters showing up before them带有额外字符的特殊字符出现在它们之前
【发布时间】:2016-02-22 10:43:09
【问题描述】:

我一直在绞尽脑汁想弄清楚如何处理用户在表单中输入的一些特殊常见字符。我的意思的例子是版权标志、注册标志、分数 1/2、分数 1/4 等。所以会发生以下情况:

用户输入这些字符,它们会被保存到一个常规的文本文件中。没问题。他们以真正纯洁的形式得救。现在,当我们用 Perl CGI 文件抓取它们并将它们显示在浏览器中时,我得到所有这些“A”和其他带有标记的 A 字符。我正在字符串上运行一个子例程,以尝试将这些从 Unicode 匹配转​​换为 HTML 实体,但它似乎不起作用。

Perl 代码:

#string with special characters
$special_chars=encodebc($special_chars);

sub encodebc{
$answer=$_[0];
$answer =~ s/:://gi;
$answer =~ s/\x{0022}/"/g;
$answer =~ s/\x{0027}/'/g;
$answer =~ s/\x{0026}/&/g;
$answer =~ s/\x{003C}/</g;
$answer =~ s/\x{003E}/>/g;
$answer =~ s/\x{0060}/`/g;
$answer =~ s/\x{007B}/{/g;
$answer =~ s/\x{007D}/}/g;
$answer =~ s/\x{00A9}/©/g;
$answer =~ s/\x{00AE}/®/g;
$answer =~ s/\x{00AB}/«/g;
$answer =~ s/\x{00BB}/»/g;
$answer =~ s/\x{00A2}/¢/g;
$answer =~ s/\x{00B0}/°/g;
$answer =~ s/\x{00B2}/²/g;
$answer =~ s/\x{00B3}/³/g;
$answer =~ s/\x{00B5}/µ/g;
$answer =~ s/\x{00BC}/¼/g;
$answer =~ s/\x{00BD}/½/g;
$answer =~ s/\x{00BE}/¾/g;
$answer =~ s/\x{00E1}/á/g;
$answer =~ s/\x{00E9}/é/g;
$answer =~ s/\x{00F1}/ñ/g;
$answer =~ s/\x{00F5}/õ/g;
$answer =~ s/\x{00F8}/ø/g;
return $answer;
}

在上面的代码中,我匹配的是 Unicode 中的两字节字符……所以我不明白“A”字符的来源。

在您对我投反对票之前,请知道我已经花费了数小时的时间来研究此问题并阅读以试图弄清楚这一点。我感谢任何可以在这里帮助我的人。

【问题讨论】:

  • 非常关于在 Perl 中处理 Unicode 的长答案:stackoverflow.com/questions/6162484/…
  • 但简而言之:“它们真实而纯粹的形式”并没有任何意义。它必须使用一些编码(如 UTF-8 或 UTF-16)存储。如果您的文本看起来像 'áâã',那么您可能正在发送 UTF-8,但在 HTTP 标头中将其声明为 ISO-8859-1。
  • 看起来就是这样。感谢 Perl 中有关 Unicode 的文章的链接!我的头现在在游泳!

标签: html perl unicode


【解决方案1】:

将 http 标头更改为 -charset=>'utf-8',现在它可以完美运行了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 2014-05-09
    • 2019-09-06
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2012-10-06
    相关资源
    最近更新 更多