【发布时间】:2011-04-12 08:31:41
【问题描述】:
我们在 Catalyst 应用程序中使用模板工具包。我们将 TT 配置为使用 UTF-8,之前没有任何问题。
现在我调用字符串 var 的 substr() 方法。不幸的是,它确实在 n 个字节而不是 n 个字符之后分割字符串。如果第 n 和第 (n+1) 字节构建了一个 unicode char,它将被拆分,并且只有第一个字节是 substr() 结果的一部分。
如何修复或解决该行为?
[% string = "fööbär";
string.length; # prints 9
string.substr(0, 5); # prints "föö" (1 ascii + 2x 2 byte unicode)
string.substr(0, 4): # prints "fö?" (1 ascii, 1x 2 byte unicode, 1 unknown char)
%]
到目前为止,我们对 Unicode 字符没有任何问题,既不是来自数据库,也不是来自模板中的文本。
编辑:这是我在 Catalyst 应用程序中配置 Catalyst::View::TT 模块的方式:
__PACKAGE__->config(
# DEBUG => DEBUG_ALL,
DEFAULT_ENCODING => 'utf-8',
INCLUDE_PATH => My::App->path_to( 'root', 'templates' ),
TEMPLATE_EXTENSION => '.tt',
WRAPPER => "wrapper/default.tt",
render_die => 1,
);
【问题讨论】:
-
我的建议(在我的答案的更新中添加)在您的源代码中使用
use utf8指令是否可以解决您的问题?如果没有,您能否提供更多细节以帮助人们提供有用的答案? -
“2x 2 字节 Unicode”是什么意思? Unicode“总是”2字节(至少)。否则你根本就没有 Unicode 文本——你有一个“编码”的 Unicode 文本流。在这种情况下,您需要检查特定的编码方法。
-
@Stephen:如标题所示,这是关于 UTF-8 的。我认为 UTF-8 是几种 Unicode 编码的子集。无论确切的终端是什么,我都使用 UTF-8。
-
@halo,对不起。我没注意到。
-
@Stephen:不,Unicode 肯定不是“至少总是 2 字节”。 Unicode 是零字节:它与编码形式无关。它是一组非负整数。
标签: perl encoding utf-8 substr template-toolkit