将双字节字符串转换为十六进制

4

假设我用西里尔字母写了单词“俄语”。这相当于十六进制中的以下内容:

Русский

我有一个问题:我应该如何编写一个函数,将“俄语”中的西里尔字母转换为其上面显示的十六进制值?这个函数是否也适用于单字节字符?

你正在寻找htmlspecialchars()吗? - Brad Christie
这不会转换每个字母,只适用于特定的特殊字符。 - AlienWebguy
@brad,@alien:使用htmlentities()函数,它可以转换大多数字符。 - knittl
不支持Cryllic字符:echo htmlentities('русский'); // 输出 руÑÑкий - AlienWebguy
1
htmlentities 不会转换其中任何内容,请使用 mb_encode_numericentity - hakre
2个回答

5

〹这些东西被称为HTML实体。在PHP中,有一个函数可以创建这些实体:mb_encode_numericentity文档,它是Multibyte String扩展的一部分(演示):

$cyrillic = 'русский';

$encoding = 'UTF-8';
$convmap = array(0, 0xffff, 0, 0xffff);
$encoded = mb_encode_numericentity($cyrillic, $convmap, $encoding);

echo $encoded; # русский

然而,您需要知道您的西里尔字符串的编码方式。在这种情况下,我选择了UTF-8,根据它,您需要修改函数中的$encoding参数和$convmap数组。


2

您提供的示例不是十六进制的,但如果您想转换为十六进制,请尝试以下方法:

function strToHex($string)
{
    $hex='';
    for ($i=0; $i < strlen($string); $i++)
    {
        $hex .= dechex(ord($string[$i]));
    }
    return $hex;
}

function hexToStr($hex)
{
    $string='';
    for ($i=0; $i < strlen($hex)-1; $i+=2)
    {
        $string .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $string;
}

echo strToHex('русский'); // d180d183d181d181d0bad0b8d0b9

一个注意点 - 控制字符(如\n)会导致问题,因此您需要通过将“dechex(ord($string[$i]))”位更改为“str_pad(dechex(ord($string[$i])), 2,“0”,STR_PAD_LEFT)”来在strToHex()调用中进行0填充。但总体上是一个非常棒的答案 - 非常感谢 :-) - Dave Carpeneto

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