mysql - 为什么 Encode::decode ('UTF-8' , $var) 一切都已经在 UTF-8 中时仍然需要?

标签 mysql perl utf-8 cgi encode

在我维护的 Webapp 中,我尝试将所有内容都保存在 UTF-8 中:

  • 数据库 (CHARSET=utf8)
  • 源文件(使用utf8;用utf8编写)
  • 模板(对于模板工具包,使用 ENCODING => utf8)
  • 用户输入和输出(HTTP 中的 charset=utf8 header ,STDIN 和 STDOUT 的 binmode :utf8)

但我仍然需要对来自数据库的数据使用 Encode::decode('UTF-8',$data),否则它们将被双重编码或以某种方式损坏。

这是为什么?我怎样才能摆脱这个烦人的额外步骤?难道不应该有一种方法可以每次都以 UTF-8 格式保留所有内容,而无需手动转换任何内容吗?

最佳答案

要从数据库中正确获取 utf-8,您需要在连接时明确告诉它:

my $dbh = DBI->connect( "dbi:mysql:dbname=$db;host=localhost",
       "user", "pwd", {mysql_enable_utf8 => 1 })

正如我在问题 here 中所问的那样, 它仍然存在一些问题,但在大多数情况下它工作正常。

要回答“为什么”部分要困难得多。正如 Denis 指出的那样,最近有很多关于“为什么”的线索。也许它可以帮助你理解相关的东西。我建议使用 utf8::all ` 使 utf-8 处理更容易和更清洁的模块。

关于mysql - 为什么 Encode::decode ('UTF-8' , $var) 一切都已经在 UTF-8 中时仍然需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6485770/

相关文章:

mysql - 我的 django 中不断出现 2006 错误(服务器消失),这是为什么?

php - 如何在 opencart 中手动将产品批量分配到类别

perl - 在 @INC 中找不到 LWP/Simple.pm

linux - 如何正确运行 Perl "one liner"命令行脚本?

PHP 正则表达式 - 必须至少包含任意 2 个 UTF-8 字母

C++ 从 CreateProcess() 获取 UTF-8 输出

mysql - 未连接互联网时无法加载 AnnotationConfiguration hibernate

mysql - SQL - 计数不返回零

perl - 如何在LWP中启用IPv6支持?

xml - 什么是 Unicode U+001A 字符?又名 0x1A