将Unicode的Javascript字符串转换为PHP的utf8字符串

3

我使用输入文本制作表单。

<input type="text" id="input" value=""/>

我从网页上收到了一个utf-8编码的字符串,类似这样(使用JavaScript和jQuery)。
var str = '\u306e\u7c21\u5358\u306a\u8aac\u660e';

str是'的简单说明'。

将输入字段的值设置为'str'

$('#input').val(str);

这个输入将替换所有转义字符串 '\' 并设置字符串如下。

<input type"text" id="input" value="u306eu7c21u5358u306au8aacu660e"/>

在这一点上没有问题。显示的字符也很好。

enter image description here

但是。

当我使用PHP将此字符串保存到我的数据库中时,

PHP会将此值非转义的utf8字符串'u306eu7c21u5358u306au8aacu660e'存储到数据库中

下次调用时:

<input type="text" id="input" value="<?=$str?>">

并且浏览器显示原始值

只是 'u306eu7c21u5358u306au8aacu660e'

而不是 'の簡単な説明'

enter image description here

我不知道问题出在哪里。

我已经尝试过

$str = json_decode("\"".$str."\"");
html_entity_decode(...);
mb_convert_encoding(...);

但是没有正常工作...

我怎样将这个非转义的UTF-8字符串转换为一般的UTF-8字符串?


u306eu7c21 并不是 "UTF-8"。它只是一个字符串,包含字符 "u306eu7c21"。在 Javascript/JSON 字符串文字中,\u.... 恰好是一个转义序列,但在任何情况下,“u306eu7c21” 都没有任何意义。在 UTF-8 编码(并且正确解释)的情况下,“の簡単な説明”的文本看起来像“の簡単な説明”,没有其他内容。在任何时候都不应该进行解码、编码、剥离或转换操作。如果将所有这些字符串操作步骤去除,直接发送该值会怎样? - deceze
@deceze 主要问题是$('#input').val("utf-8编码的字符串")方法强制将'\u'更改为'u',而PHP接受'uxxxxuxxxx....'字符串。服务器响应正确。UTF-8编码的字符串回复类似于'\uxxxx\uxxxx'。 - LaLaAsDev
我不知道,这似乎很奇怪。你能发一个最小的例子来重现这个问题吗?我的猜测是你并没有字面上的 var str = '\u306e...',而是从服务器(AJAX JSON?)获取了 \u306e...,但已经无法正确解码或其他原因导致失败。 - deceze
@deceze 是的,有些奇怪。很难举例说明。代码非常庞大。无论如何,我已经通过使用正则表达式替换u[0-9a-fA-F] ->为\u[0-9a-fA-F]来解决了这个问题。在存储到数据库之前进行处理。 - LaLaAsDev
1个回答

2
您必须拥有多字节字符串支持。如果进行一些额外的工作,这就是您需要的:
<?php

$str = 'u306eu7c21u5358u306au8aacu660e';

function converter($sequence) {
    return mb_convert_encoding(pack('H*', $sequence), 'UTF-8', 'UCS-2BE');  
}
# array_filter is not important here at all it just "remove" empty strings
$converted = array_map('converter', array_filter(explode('u', $str)));
$converted = join('', $converted);

print $converted;

作为一个附注,你应该找到更好的策略来分割Unicode序列。通过字符爆炸字符串有些天真。
此外,我强烈建议您阅读Armin Ronacher的优秀博客文章UCS vs UTF-8 as Internal String Encoding

请注意,首先应避免将“u306e”等垃圾发送到服务器。如果您无法修复发送端,则您的解决方案有效,但是您应该尽量避免使用此作为最后的手段。 - deceze
谢谢。但是为什么JavaScript中的$('#..').val(...)会将UTF8字符串转换为非转义字符串? - LaLaAsDev
@deceze 是的!实际上最好在数据库中设置正确的编码并将值存储为原样。 - felipsmartins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接