我有一个关于处理俄语字符以呈现首字母的问题。
1)我的html doc声明了utf-8:
<meta charset="utf-8">
2)我的MySQL数据库中的我的名字字段是:
utf8_unicode_ci
3)当我查询名为:
的用户名时Богдан Доминика
var_dump给出:
string(23) "Ð”Ð°Ñ€ÑŒÑ Ð Ñбова"
4)当我这样做时:
echo mb_detect_encoding($name)
我明白了:
UTF-8
5)用户在前端(右边)看到这个:
Богдан Доминика
我想要的是什么:
6)但是我想得到名字的首字母并打印出来。如果我这样做(缩减版):
$initials = substr($first_name, 0, 1) . substr($second_name, 0, 1)
7)我在前端得到了这个:
�Р
8)如果我拿第一个和第二个名字的前两个字符,我得到我想要的结果:
БД
问题:
如何确定3)中的字符串是俄语(或任何其他字符集)?
答案 0 :(得分:4)
您需要使用PHP的多字节函数...例如mb_substr
http://us3.php.net/mb_substr
答案 1 :(得分:0)
我相信有一个检测俄罗斯编码的错误。见https://bugs.php.net/bug.php?id=38138
<强>摘录:强>
禁用mb_detect_encoding中的俄语编码检测 虽然它出现在支持的编码列表中。它只是 三个相当简单的编码--windows-1251,cp866和koi8-r 破坏俄罗斯程序员的日常生活习惯,减少PHP 对数百万潜在的PHP开发人员很有吸引力。
您可能希望为此目的使用其他功能,例如mb_substr()。
答案 2 :(得分:0)
俄语是一种语言,而不是字符集。 Unicode(以UTF-8编码)包含所有世界语言的字符,是您应该使用的唯一字符集。特定于语言的字符集,例如带有变音符号的英语和欧洲语言的ISO-8859-1(例如德语,法语和瑞典语)和用于西里尔语的ISO-8859-5是ASCII的遗留扩展,仅限于特定脚本。使用Unicode(通过UTF-8)允许您的脚本支持所有可能的字符。
如果您正确使用Unicode,您正在处理的文字的语言和脚本将变得无关紧要。这意味着,如果您正确使用多字节扩展名(以mb_
开头的那些函数),则无需担心您正在处理的语言。
但是让我们继续讨论你的具体问题。首先,使用Content-Type
HTTP标头设置正确的编码而不是meta
标记。将以下内容添加到脚本的开头,然后删除meta
标记:
header("Content-Type: text/html; charset=utf-8");
这也应该修复var_dump
输出。
接下来,要获取全名的缩写,您需要执行以下操作:
试试这个例子:
<?php
header("Content-Type: text/html; charset=utf-8");
if(isset($_POST['name'])) {
$full_name = $_POST['name'];
// split the name on whitespace, this includes Unicode characters
// that represent whitespace but are not 0x20 (ASCII space)
$elements = preg_split('/\s+/', $full_name);
// get the initials
$initials = '';
foreach($elements as $element) {
$initials .= mb_substr($element, 0, 1, 'UTF-8');
}
echo "<p>Your initials are: ", $initials, "</p>\n";
}
?>
<form action="" method="POST">
<p>
Please enter your name:
<input type="text" name="name" />
<input type="submit" />
</p>
</form>
我在https://peschar.net/files/initials.php为您提供了一个演示。