更改 iconv() 替换字符

Change iconv() replacement character

我正在使用 iconv() 替换 api 请求的字符,如下所示:

$text = iconv("UTF-8", "ASCII//TRANSLIT", $text);

这很好用,但是当遇到未知字符时,它会被替换为 ?。有什么直接的方法可以将替换字符更改为其他字符?说一个space?我知道 mb 函数的设置 mb_substitute_character() - 但这不适用于 iconv().

示例:

$text = '? € é î ü π ∑ ñ';
echo iconv("UTF-8", "ASCII//TRANSLIT", $text), PHP_EOL;

输出:

? EUR e i u ? ? n

期望的输出:

? EUR e i u     n

据我所知,没有可让您指定自己的替换字符的转换函数,但您可以通过实现自己的简单转义来解决这个问题。

function my_translit($text, $replace='!', $in_charset='UTF-8', $out_charset='ASCII//TRANSLIT') {
    // escape existing ?
    $res = str_replace(['\', '?'], ['\\', '\?'], $text);
    // translit
    $res = iconv($in_charset, $out_charset, $res);
    // replace unescaped ?
    $res = preg_replace('/(?<!\\)\?/', $replace, $res);
    // unescape
    return str_replace(['\\', '\?'], ['\', '?'], $res);
}

$text = '? € é î ü π ∑ ñ \? \\? \\\?';
var_dump(
    $text,
    my_translit($text)
);

结果:

string(36) "? € é î ü π ∑ ñ \? \? \\?"
string(29) "? EUR ! ! ! p ! ! \? \? \\?"

我不确定为什么我的系统上的音译输出不同,但字符替换有效。