如何获得俄语-PHP中姓名的首字母?

如何获得俄语-PHP中姓名的首字母?,php,utf-8,character-encoding,Php,Utf 8,Character Encoding,我有一个关于处理俄文字符以呈现首字母的问题 1我的html文档已声明utf-8: <meta charset="utf-8"> 3当我查询一个名为: Богдан Доминика 变量转储提供: string(23) "Ð”Ð°Ñ€ÑŒÑ Ð Ñбова" 4当我这样做时: echo mb_detect_encoding($name) 我得到: UTF-8 5用户可以在前端看到这一点,这是正确的: Богдан Доминика 我想要的是: 但是我想得到名字的

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

1我的html文档已声明utf-8:

<meta charset="utf-8">
3当我查询一个名为:

Богдан Доминика
变量转储提供:

string(23) "Ð”Ð°Ñ€ÑŒÑ Ð Ñбова"
4当我这样做时:

echo mb_detect_encoding($name)
我得到:

UTF-8
5用户可以在前端看到这一点,这是正确的:

Богдан Доминика
我想要的是:

但是我想得到名字的首字母并打印出来。如果我做这个精简版本:

$initials = substr($first_name, 0, 1) . substr($second_name, 0, 1)
7我在前端看到这个:

�Р
8如果我取第一个和第二个名字的前两个字符,我会得到我想要的结果:

БД
问题:


如何确定3中的字符串是俄语还是任何其他字符集?

您需要使用PHP的多字节函数。。。例如mb_substr

您需要使用PHP的多字节函数。。。例如mb_substr

我相信有一个bug可以检测俄语编码。看

摘录:

已禁用mb_detect_编码中的俄语编码检测 尽管它出现在支持的编码列表中。只是 三种相当简单的编码——windows-1251、cp866和koi8-r 破坏俄罗斯程序员的日常生活,减少PHP的使用 吸引了数百万潜在的PHP开发人员


您可能需要使用一个不同的函数,例如用于此目的。

我认为检测俄语编码有一个bug。看

摘录:

已禁用mb_detect_编码中的俄语编码检测 尽管它出现在支持的编码列表中。只是 三种相当简单的编码——windows-1251、cp866和koi8-r 破坏俄罗斯程序员的日常生活,减少PHP的使用 吸引了数百万潜在的PHP开发人员


您可能需要使用不同的函数,例如用于此目的。

俄语是一种语言,而不是字符集。UTF-8编码的Unicode包含所有世界语言的字符,是您应该使用的唯一字符集。特定于语言的字符集,如ISO-8859-1(适用于英语和欧洲语言)以及ISO-8859-5(适用于德语、法语和瑞典语)和ISO-8859-5(适用于西里尔语),是ASCII的传统扩展,仅限于特定的脚本。通过UTF-8使用Unicode允许脚本支持所有可能的字符

如果正确使用Unicode,则处理的文本的语言和脚本将变得无关。这意味着,如果您使用的是多字节扩展,即那些以mb_u开头的函数,那么就不必担心您正在处理的语言

但让我们继续讨论你的具体问题。首先,使用内容类型HTTP头来设置正确的编码,而不是元标记。将以下内容添加到脚本开头并删除元标记:

这还应该修复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>

我已经在为您提供了一个演示。

俄语是一种语言,而不是字符集。UTF-8编码的Unicode包含所有世界语言的字符,是您应该使用的唯一字符集。特定于语言的字符集,如ISO-8859-1(适用于英语和欧洲语言)以及ISO-8859-5(适用于德语、法语和瑞典语)和ISO-8859-5(适用于西里尔语),是ASCII的传统扩展,仅限于特定的脚本。通过UTF-8使用Unicode允许脚本支持所有可能的字符

如果正确使用Unicode,则处理的文本的语言和脚本将变得无关。这意味着,如果您使用的是多字节扩展,即那些以mb_u开头的函数,那么就不必担心您正在处理的语言

但让我们继续讨论你的具体问题。首先,使用内容类型HTTP头来设置正确的编码,而不是元标记。将以下内容添加到脚本开头并删除元标记:

这还应该修复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>
我已经在为你做了一个演示

<?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>