我想用引号替换无效的UTF-8字符(PHP 5.3.5).
到目前为止,我有这个解决方案,但删除了无效字符,而不是被'?'取代.
function replace_invalid_utf8($str)
{
return mb_convert_encoding($str, 'UTF-8', 'UTF-8');
}
echo mb_substitute_character()."\n";
echo replace_invalid_utf8('éééaaaàààeeé')."\n";
echo replace_invalid_utf8('eeeaaaaaaeeé')."\n";
Run Code Online (Sandbox Code Playgroud)
应输出:
63 // ASCII code for '?' character
???aaa???eé // or ??aa??eé
eeeaaaaaaeeé
Run Code Online (Sandbox Code Playgroud)
但目前产出:
63
aaaee // removed invalid characters
eeeaaaaaaeeé
Run Code Online (Sandbox Code Playgroud)
有什么建议?
你会用另一种方式(preg_replace()例如使用?)
谢谢.
出于某种原因,mb_convert_encoding在phpunit中运行时,我得到了意想不到的结果.例如,执行以下操作:
var_dump( mb_convert_encoding( utf8_decode( 'ö' ), 'UTF-8' ) === 'ö' )
上面的返回bool (true)在PHP-FPM和PHP-CLI下,但是在PHPunit下返回false,mb_convert_encoding()正在做某事,它只是编码为乱搞的字符串.
mbstring PHP模块有一个strict_detection设置,在此处记录.不幸的是,手册完全没用; 它只说这个选项"启用严格的编码检测".
我做了一些测试,无法找到任何mbstring函数如何受此影响.mb_check_encoding()并mb_detect_encoding()为有效和无效的UTF-8输入提供完全相同的结果.
(编辑:)该mbstring.strict_detection选项是在PHP 5.1.2中添加的.
我使用几乎最新版本的PHP(5.5.11),这是问题所在.当我使用json_encode字符串的一部分时,它返回false.在我开始使用的时候substr,但后来我意识到在处理非英语字符串时这是完全错误的.但即使在我使用后,mb_substr我仍然看到json_encode回报false:
$s = "????????????????????J??????????????????????????????????????";
$a = mb_substr($s, 0, 10);
Run Code Online (Sandbox Code Playgroud)
正如你看到的,
var_dump( json_encode([
'd' => $a
]) );
Run Code Online (Sandbox Code Playgroud)
回归false,和
var_dump( json_encode([
'd' => $s
]) );
Run Code Online (Sandbox Code Playgroud)
返回正确的json.
在研究json_last_error时,我发现这是由于Malformed UTF-8 characters, possibly incorrectly encoded.所以问题是mb_substr给了我畸形的字符.
当我var_dump($a);看到它看到它产生string(10) "????"(我假设每个日语字符是3个字节,并且该问号是格式错误的字符).
那么如何以这种方式从字符串中获取子字符串,以至于我不会得到格式错误的字符串?
我想从不受支持的ubuntu 12.10版本迁移我的Web服务器.我安装了16.04并安装了apache2,php7,mysql和phpmyadmin.
当我想使用phpmyadmin我有错误,mbstring丢失.
在PHP.ini文件中,只能为Windows启用此扩展.
当我安装mbstring包时,当我重新加载phpmyadmin页面时,我得到空白页面没有任何错误.
我安装了以下包:
apache2, php, libapache2-mod-php, php-mysql, php-mbstring, php7.0-mbstring, mysql-server, phpmyadmin
Run Code Online (Sandbox Code Playgroud)
当我卸载mbstring包时,在phpmyadmin重载后我看到mbstring扩展错误...
该怎么办?我花了两天时间来解决这个问题,但都没有成功......谢谢
有没有办法确定特定编码中字符所需的最小字节数?像mbstring扩展支持的编码之一.UTF-8的值为1,UTF-16的值为2等.
我不想获得特定字符串或字符的长度.
我想知道给定编码支持的最小字符大小,根据它的规范.
我目前使用此代码:
<?php
function flawed_detection($encoding)
{
// I use 'a' in the hope that this char need the least number of bytes in all the supported encodings
return strlen(mb_convert_encoding('a', $encoding, 'UTF-8'));
}
foreach (mb_list_encodings() as $encoding) {
echo "$encoding: ", flawed_detection($encoding), "\n";
}
Run Code Online (Sandbox Code Playgroud)
部分输出:
...
UTF-16LE: 2
UTF-8: 1
UTF-7: 1
UTF7-IMAP: 1
ASCII: 1
EUC-JP: 1
...
Run Code Online (Sandbox Code Playgroud)
但我不确定要使用的"正确"字符.如果有的话.
编辑:我已经在每个编码中测试了从0到U + 10FFFF的每个字符的暴力方法,结果与我的finally_not_so_flawed_detection函数(使用'a'char或空格)完全相同:p
我在服务器上安装了php 7.2,除了这3个问题外,其他一切都正常。
我面临以下问题:
未加载PHP扩展名dom。请与您的服务器管理员联系或访问http://php.net/manual/en/dom.installation.php 进行安装。
未加载PHP扩展名mbstring。请与您的服务器管理员联系,或访问 http://php.net/manual/en/mbstring.installation.php进行安装。
未加载PHP扩展simplexml。请与您的服务器管理员联系,或访问 http://php.net/manual/en/simplexml.installation.php进行安装。
...现在当我输入php -m时
[root@localhost php.d]# php -m
[PHP Modules]
bz2
calendar
Core
ctype
curl
date
exif
fileinfo
filter
ftp
gd
gettext
hash
iconv
json
ldap
libxml
mcrypt
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
readline
Reflection
session
sockets
SPL
sqlite3
standard
tokenizer
zlib
[Zend Modules]
[root@localhost php.d]#
Run Code Online (Sandbox Code Playgroud)
它表明没有mbstring,dom或simplexml模块。
我已经尝试了所有可以在Google上找到的内容,但似乎无法安装这3个模块。
php -v返回此
PHP 7.2.7 (cli) (built: Jun 20 2018 08:21:26) ( NTS )
Copyright (c) 1997-2018 The PHP …Run Code Online (Sandbox Code Playgroud) 根据手册,在PHP 7.3中添加了以下常量:
MB_CASE_FOLDMB_CASE_LOWER_SIMPLEMB_CASE_UPPER_SIMPLEMB_CASE_TITLE_SIMPLEMB_CASE_FOLD_SIMPLE我找到了一个做什么的例子MB_CASE_FOLD:
echo mb_convert_case('?', MB_CASE_FOLD, 'UTF-8'); // ss
Run Code Online (Sandbox Code Playgroud)
但是,我找不到任何有关MB_CASE_*_SIMPLE常量的引用。
乍一看,使用简单的latin1字符,MB_CASE_LOWER_SIMPLE其行为就像MB_CASE_LOWER。
什么的MB_CASE_*_SIMPLE从他们做不同MB_CASE_*的同行?
假设我有一个字符串“HET1200 文本字符串”,我需要将其更改为“HET1200 文本字符串”。编码将是 UTF-8。
我怎样才能做到这一点?目前,我使用mb_convert_case($string, MB_CASE_TITLE, "UTF-8");但将“HET1200”更改为“Het1200。
我可以指定一个例外,但它不会是详尽无遗的。所以我宁愿所有的大写单词都保持大写。
谢谢 :)
我是 docker 的新手,我正在尝试设置它以便与 Laravel 5.1 一起运行。我目前收到以下错误
Call to undefined function Illuminate\Foundation\Bootstrap\mb_internal_encoding() in /var/www/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadConfiguration.php:43
Run Code Online (Sandbox Code Playgroud)
我相信这是因为mbstring没有安装 php 扩展。我试图添加php-mbstring到 Docker 文件,但它似乎不起作用。
这是我的完整 Docker 文件
FROM php:5.6.30-fpm
RUN apt-get update && apt-get install -y libmcrypt-dev \
mysql-client libmagickwand-dev --no-install-recommends \
&& pecl install imagick \
&& docker-php-ext-install mcrypt pdo_mysql \
&& docker-php-ext-install php-mbstring
Run Code Online (Sandbox Code Playgroud)
然后我sudo docker compose up从应用程序文件夹运行。但这似乎并没有解决错误。我如何知道扩展是否安装正确?
编辑:我在下面包含了 docker-compose.yml 文件
version: '2'
services:
# The Application
app:
build:
context: ./
dockerfile: app.dockerfile
working_dir: /var/www
volumes:
- ./:/var/www
environment: …Run Code Online (Sandbox Code Playgroud)