如何用俄语获取名称的首字母 - PHP?

时间:2013-06-28 20:59:32

标签: php utf-8 character-encoding

我有一个关于处理俄语字符以呈现首字母的问题。

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)中的字符串是俄语(或任何其他字符集)?

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输出。

接下来,要获取全名的缩写,您需要执行以下操作:

  1. 拆分名称以获取姓名。
  2. 获取每个元素的第一个字母。
  3. 合并字母以获得缩写。
  4. 试试这个例子:

    <?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为您提供了一个演示。