PHP UTF-8问题-如果我在PHP中创建字符串。。。是UTF-8吗?

PHP UTF-8问题-如果我在PHP中创建字符串。。。是UTF-8吗?,php,unicode,utf-8,Php,Unicode,Utf 8,在PHP中,如果我创建如下字符串: $str = "bla bla here is my string"; $str=“bla bla这是我的字符串”; 然后,我是否能够使用mbstring函数将该字符串作为UTF8进行操作 // Will this work? $str = mb_strlen($str); //这样行吗? $str=mb_strlen($str); 此外,如果我知道另一个字符串是UTF-8(比如说它是一个发布的表单值,或者是数据库中的UTF-8字符串),那么我可以将这两个字符

在PHP中,如果我创建如下字符串:

$str = "bla bla here is my string"; $str=“bla bla这是我的字符串”; 然后,我是否能够使用mbstring函数将该字符串作为UTF8进行操作

// Will this work? $str = mb_strlen($str); //这样行吗? $str=mb_strlen($str); 此外,如果我知道另一个字符串是UTF-8(比如说它是一个发布的表单值,或者是数据库中的UTF-8字符串),那么我可以将这两个字符串连接起来而不出现任何问题吗

// What about this, will this work? $str = $str . $utf8_string_from_database; //这个怎么样,这个行吗? $str=$str$utf8_字符串_来自_数据库;
第一个问题:这取决于字符串中的确切内容。

在PHP中(无论如何直到PHP5),字符串只是字节序列。没有与它们关联的隐含或显式字符集;这是程序员必须跟踪的事情。因此,如果您只在引号之间放置有效的UTF-8字节(如果文件本身编码为UTF-8,则相当容易),那么字符串将是UTF-8,您可以安全地在其上使用mb_strlen()

此外,如果您使用的是mbstring函数,则需要显式地告诉它字符串是什么字符集,或者作为任何mbstring函数的最后一个参数

第二个问题:是的,需要注意。


两个都独立有效的UTF-8字符串可以安全地按字节连接(与PHP的
运算符类似),并且仍然是有效的UTF-8。但是,如果不亲自做一些工作,您永远无法确定发布的字符串是否是有效的UTF-8。如果您仔细设置连接字符集,数据库字符串会更容易一些,因为大多数DBMS都会为您进行任何转换。

在执行任何此操作之前,请确保将默认的\u字符集指令设置为UTF-8

可以直接修改php.ini,也可以在运行时使用

<?php

ini_set( 'default_charset', 'UTF-8' );

如果源代码是UTF-8格式,则字符串是UTF-8格式,如果不是-则不是。由于示例字符串仅为英语,因此它是有效的UTF-8

PHP本身并不了解字符集。如果将内容传递给mb*函数,它会将其视为UTF-8字符串


如果我对UTF-8的理解是正确的,那么连接无论如何都必须正常工作:-)只需确保两个字符串都是UTF-8,否则您将得到奇怪的字符串。

所有这些操作都是控制发送到客户端的头。它实际上并不影响PHP处理字符串的方式,它所做的还不止这些。尝试使用默认字符集ISO-8859-1执行urldecode(“%C3%A9”),然后再次使用默认字符集UTF-8执行urldecode。但是你是对的,这与PHP如何在位级别处理字符串没有关系。你会看到不同结果的唯一原因是你的浏览器对这些字节的解释不同。就像我说的,它对PHP如何处理字符串没有任何影响,我不想在这里开始讨论,但我认为你没有抓住我的重点。我说的是字符串“%C3%A9”如何被解释为单个2字节序列,或两个1字节序列。无论是否使用浏览器,这个问题都存在,尽管这肯定是最常见的问题。问题是PHP本身如何处理字节序列。设置default_字符集对PHP处理字节序列的方式没有任何影响。关于第二个答案,这就是为什么编码验证/转换必须是任何输入验证例程的一部分。为此,使用PHP流输入过滤器(iconv)将使您能够将UTF-8字符串输入到应用程序中,而无需使用手动循环和MB/iconv函数。学习从客户处获取信息php://input 流包装器是关键。