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


Print non ASCII characters as their hex in PHP

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

我想让用户输入标准制表符,新行等(可能高达ASCII 127)。

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

我尝试了preg_replace('/[[:^print:]]/', '', $string),但它最终删除了制表符,新行等

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

对于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