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

时间:2014-05-07 06:47:31

标签: php character-encoding non-ascii-characters

如何在PHP中打印一个字符串,其中所有非ASCII字符都转换为其HEX值(例如0x02)并显示? 我希望用户知道他们输入的是非ASCII值。我不想剥离他们。相反,我想显示它,以便他们可以编辑和纠正错误。

我想允许用户输入标准选项卡,新行等(可能高达ASCII 127)。

我尝试了quoted_printable_encode(),但它显示==3D。 其他非ASCII字符为=[HEXVAL]。等号会造成混乱。

我尝试了preg_replace('/[[:^print:]]/', '', $string),但最终删除了标签,换行等等。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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