我正在开发一个支持多种语言的应用程序,并且具有尝试使用浏览器请求的语言并且还允许手动覆盖此功能的功能。这部分工作正常,并选择正确的模板,标签等。
用户有时必须自己输入文本,这就是我遇到问题的地方,因为应用程序必须接受甚至是“复杂”的语言,如中文和俄文。到目前为止,我已经处理了其他帖子中提到的事情,即:
mb_internal_encoding( 'UTF-8' )
meta http-equiv=Content-Type content=text/html;charset=UTF-8
呈现网页时设置正确的编码(由于stackoverflow限制而调整格式)mb_detect_encoding() == UTF-8
setLocale(LC_CTYPE, "UTF-8")
,这似乎不起作用,因为它需要选择一种语言,我无法指定,因为我必须支持几种语言。如果我手动强制进行测试,它仍然会失败,即:中文文字setLocale(LC_CTYPE,"zh__CN.utf8")
- ctype_alpha()
仍会失败即使明确的语言选择似乎也不会使ctype_alpha()
有用。
因此问题是:我应该如何检查所有语言的字母字符?
我目前唯一的想法是手动检查“有效”字符数组 - 但这对中国人来说似乎很难看。
您如何解决这个问题?
答案 0 :(得分:6)
如果你想检查有效的unicode字母而不管使用的语言我建议使用正则表达式(如果你的pcre-regex扩展是使用unicode支持构建的):
// adjust pattern to your needs
// $input needs to be UTF-8 encoded
if (preg_match('/^\p{L}+$/u', $input)) {
// OK
} else {
// not OK
}
\p{L}
使用L
(etter)属性检查unicode字符,其中包含属性Ll
(小写字母),Lm
(修饰符),{{ 1}}(其他字母),Lo
(标题大小写字母)和Lt
(大写字母) - 来自:Regular Expression Details)。
答案 1 :(得分:0)
我不会使用一组字符。这将无法管理。
我建议的是从IP地址中找出一种“默认”语言,并将其用作请求的语言环境。在某些情况下,您也可以从浏览器代理字符串中获取它。您可以为用户提供一种覆盖方式,这样如果您的默认设置不正确,他们就不会遇到奇怪的网站。 (例如,在'语言设置为英语的形式上提供。如果这不正确,请更改:'。这不是最好的事情,但是你不会得到任何有效的验证,否则你需要语言/语言环境设置是为了进行合理的alpha验证(A A不是中文字母)。
答案 2 :(得分:0)
您可以使用
中的语言$_SERVER['HTTP_ACCEPT_LANGUAGE']
它包含类似
的内容de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
所以你需要解析这个字符串。然后,您可以使用 setLocale 函数中的首选语言。
答案 3 :(得分:0)
这是一个编码问题,而不是语言检测问题。因为UTF-8可以编码任何Unicode字符。
最好的方法是在整个项目中使用UTF-8:在数据库中,输出中以及输入的预期编码。
Content-Type
field的HTTP标头中声明,而不仅仅是在文档中。accept-charset
attribute中声明预期的编码。