【问题标题】:PHP equivalent of Java's unescapeJava() functionPHP 等效于 Java 的 unescapeJava() 函数
【发布时间】:2012-11-27 23:47:40
【问题描述】:

以下 Java 函数的 PHP 等效项是什么?

str = org.apache.commons.lang.StringEscapeUtils.unescapeJava(str);

这个函数存在于Apache Commons Lang中,下面是函数的描述

取消转义在字符串中找到的任何 Java 文字。例如,它将 将 '\' 和 'n' 的序列转换为换行符,除非 '\' 前面有另一个 '\'。

编辑

我找到的一个解决方案是这样的

echo json_decode('"' . $str . '"');

但我认为应该有一些其他优雅的解决方案。

编辑 2

正如@julp 所建议的,transliterate 是另一种选择,但它仅适用于 PHP 5.4 及更高版本。不幸的是,我仍在使用 PHP 5.3,需要一个适用于 PHP 5.3 的解决方案

【问题讨论】:

  • PHP 使用双引号内的字符串自动执行此操作"
  • @Dale 当我有 \u2002 等 unicode 字符时它不会这样做。
  • @Sudar php 不支持\uxxxx-escape 序列
  • @Esailija 虽然 PHP 字符串语法不支持 unicode 转义序列,但 PHP 的 json_decode 函数会将这些字符正确解码为有效字节。例如var_dump(json_decode('"\u2002"')); 将返回一个正确表示这些 un​​icode 字节的 3 字节字符串。
  • @GoogleGuy 是的,但没那么简单,你现在需要escapeJSONString 函数

标签: php unicode character-encoding


【解决方案1】:

PHP strings 是 Java 字节数组的等价物。它们(根据定义)是 256 位字符集(字节 0x00-0xff)。但是,PHP 字符串语法已经在双引号字符串中提供了某些转义字符序列的插值 (see the manual page for more details)。

但是,如果您接收的是 JSON 编码字符串,则 json_decode 函数会将该字符串正确解码为 PHP(前提是它符合 JSON 规范)。

$json_string = '"Hello\nWorld"';
var_dump(json_decode($json_string));
/*
Notice that the string output is 11 characters long and a line break character is present

string(11) "Hello
World"
*/

【讨论】:

  • 是的,json_deocde 是一种选择。但我正在尝试看看是否有更好的方法。
  • 我不知道。那里可能有一些用 PHP 编写的函数的用户态实现,但 PHP 不提供本机实现(至少我在手册或 PHP PECL 存储库中找不到)。最好的办法是不要在 PHP 中使用序列化/转义字符串。改为发送字节数组字符串,否则您将不得不滚动自己的非转义函数。
【解决方案2】:

使用 PHP >= 5.4 和 intl 扩展,您有 Transliterator 类:

$in = '\u0041\U00000062';
$out = transliterator_create('Hex-Any')->transliterate($in);
var_dump($out); # string(2) "Ab"

【讨论】:

  • 啊,直译者 +1。我忘记了所有关于国际的:)
  • 不幸的是,我仍在使用 PHP 5.3,无法使用此解决方案 :(
猜你喜欢
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 2014-07-13
  • 1970-01-01
相关资源
最近更新 更多