变量(下面的$my_charset
)包含用户提供的字符集/编码字符串,预期为UTF-8
,ISO-8859-1
或Windows-1251
。我如何以编程方式验证它?我也有处理用户提供的文本(下面是$my_text
),据说这种编码。
到目前为止我的解决方案:
$is_valid = @mb_check_encoding($my_text, $my_charset);
我不喜欢它,因为:
@
来抑制错误(例如警告:mb_check_encoding():无效编码“some-invalid-encoding”),这是错误的编程习惯。false
返回的值无法帮助我区分错误的charset字符串与有效的charset字符串和错误编码的文本。 PHP提供mb_list_encodings()
和mb_encoding_aliases()
函数,我可以使用这些函数构建所有支持的编码列表,如果用户提供的编码包含在此列表中,则以不区分大小写的方式检查。我不喜欢这个解决方案,矫枉过正。需要为mb_encoding_aliases()
(超过50)返回的每件商品致电mb_list_encodings()
。
你有更好的解决方案吗?
答案 0 :(得分:2)
您可以使用以下方式自行验证提供的字符集:
$is_valid = @mb_check_encoding('', $my_charset);
错误控制操作符可能很蹩脚,但在此处使用它并没有错。它存在的原因超越了邪恶。而且,您不必担心将不受支持的编码与错误编码的文本混淆。
如果您仍想避免这种情况,使用mb_list_encodings
和mb_encoding_aliases
并不过分 - 大约有50个编码,每个约有4个别名不。虽然如果你不想在每个请求上运行它们,你可以使用它们来生成静态数组并加载它。
$encodings = mb_list_encodings();
foreach ($encodings as $enc) {
$encodings = array_merge($encodings, mb_encoding_aliases($enc));
}
$encodings = array_change_key_case(array_fill_keys($encodings, true));
var_export($encodings);
这会转出有效的PHP,您可以将其直接粘贴到php文件中。您可以使用serialize
或json_encode
对其进行序列化,并在以后对其进行反序列化,无论您进入的是什么。
它使用编码作为键而不是值,因此您的查找将在O(1)时间而不是O(n)中进行。 array_change_key_case
可以将它们全部小写以便于查找:
$is_valid = isset($encodings[strtolower($my_charset)]);