在PHP中将非ASCII字符打印为十六进制

3
如何在PHP中打印一个字符串,其中所有的非ASCII字符都被转换为它们的HEX值(例如0x02)并显示出来? 我希望用户知道他们正在输入非ASCII值。 我不想剥离它们。 相反,我想显示它,以便他们可以编辑和更正错误。
我想允许用户输入标准制表符、换行符等(可能是ASCII 127以下的)。
我尝试过quoted_printable_encode(),但它将=显示为=3D。 其他非ASCII字符为=[HEXVAL]。 等号会引起混淆。
我尝试过preg_replace('/[[:^print:]]/', '', $string),但结果是删除了制表符、换行符等。

你能否提供一个字符串的例子和期望的输出?(同时包括你已经尝试过的内容。) - Amal Murali
2个回答

7
substr(json_encode((string)$string), 1, -1)

这对于格式不正确的UTF-8无效,因为json_encode将只返回一个空字符串(或抛出异常,如果您使用JSON_THROW_ON_ERROR)。 - Steen Schütt

2

当涉及到Unicode字符时,这很难实现。即使是有效的Unicode字符(有大量这样的字符),也可能无法打印,因为当前字体不包含该字符的字母定义。这意味着,例如,德语Unicode字体可能不包含所有有效的中文字符。

如果您只关心ASCII,则可以使用ctype_print()来检查一个字符是否可打印。

示例:

// test string contains printable and non printable characters
$string = "\x12\x12hello\x10world\x03";

$allowed = array("\x10", /* , ... */);

// iterate through string
for($i=0; $i < strlen($string); $i++) {

    // check if current char is printable
    if(ctype_print($string[$i]) || in_array($string[$i], $allowed)) {
        print $string[$i];
    } else {
        // use printf and ord to print the hex value if
        // it is a non printable character
        printf("\\x%02X", ord($string[$i]));
    }   
}

输出:

\x12\x12hello
world\x03

ctype_print函数的注释说制表符和回车不会被识别为可打印字符。但我需要它们被显示出来。 - Binoj D
1
使用白名单怎么样?我把它命名为$allowed。请查看我的更新。 - hek2mgl

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