如何在PHP中将UTF8字符转换为数字字符实体

13

是否可能使用PHP翻译下面的代码?

下面的代码是用JavaScript编写的。它会在必要时返回带有数字字符引用的HTML。例如:smslån -> smslån

我尝试过进行翻译但未成功。这个脚本看起来可能有效,但它将å转换为å而不是像下面的JavaScript一样转换为å

function toEntity() {
  var aa = document.form.utf.value;
  var bb = '';
  for(i=0; i<aa.length; i++)
  {
    if(aa.charCodeAt(i)>127)
    {
      bb += '&#' + aa.charCodeAt(i) + ';';
    }
    else
    {
      bb += aa.charAt(i);
    }
  }
  document.form.entity.value = bb;
}

PHP的ord函数听起来像是和charCodeAt做了相同的事情,但实际上并不一样。使用ord函数得到的195是表示å的,而使用charCodeAt得到的229才是正确的。这可能意味着我遇到了非常棘手的编码问题。


你是指这个吗?(http://www.php.net/manual/en/function.mb-encode-numericentity.php#88586),或者基本上是phihag在下面的回答?我没有看到任何utf8版本的ord。 - darkAsPitch
我不确定。我尝试了Miguel的代码大约20分钟,但似乎phihag下面建议的正是我所需要的。至少在这个应用程序方面是这样。有没有理由认为它不是呢? - darkAsPitch
1个回答

35

使用mb_encode_numericentity函数:

$convmap = array(0x80, 0xffff, 0, 0xffff);
echo mb_encode_numericentity($utf8Str, $convmap, 'UTF-8');

1
是的,当我想回答时,我看到你已经做了,所以我注意到了。 ;) 这对工作来说真的是一个很酷的功能。 - hakre
3
唯一让我担心的是$convmap - 它到底是什么?手册页面上没有很好的解释。我需要输入所有可能的转换吗?我的脑海里理解成“转换地图”。 - darkAsPitch
7
这段话的意思是:这很混乱。$convmap指定了要编码的字符。它本应该是一个回调函数,但可能会很慢,而且在php中使用回调函数的方式早于该函数。前两个数字指定要转换的字符代码范围(包括端点),第三个和第四个数字是偏移量和位掩码(所有实际目的都为0和0xfff)。例如,如果您想将所有字符转换为HTML实体,则应指定array(0, 0xfff, 0, 0xfff)。基本上,(0x80, 0xffff, ..)等同于您问题中的charCode > 127 - phihag

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