`
风华舞依
  • 浏览: 8144 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

php iconv() : Detected an illegal character in input string

阅读更多
PHP传给JS字符串用ecsape转换加到url里,又用PHP接收,再用网上找的unscape函数转换一下,这样得到的字符串是UTF-8的,但我需要的是GB2312,于是用iconv转换
开始是这样用的
$str = iconv('UTF-8', 'GB2312', unescape(isset($_GET['str'])? $_GET['str']:''));
上线后报一堆这样的错:iconv() : Detected an illegal character in input string

考虑到GB2312字符集比较小,换个大的吧,于是改成GBK:
$str = iconv('UTF-8', 'GBK', unescape(isset($_GET['str'])? $_GET['str']:''));
上线后还是报同样的错!

再认真读手册,发现有这么一段:
If you append the string //TRANSLIT to out_charset transliteration is activated. This means that when a character can't be represented in the target charset, it can be approximated through one or several similarly looking characters. If you append the string //IGNORE, characters that cannot be represented in the target charset are silently discarded. Otherwise, str is cut from the first illegal character.
于是改成:
$str = iconv('UTF-8', 'GBK//IGNORE', unescape(isset($_GET['str'])? $_GET['str']:''));
本地测试//IGNORE能忽略掉它不认识的字接着往下转,并且不报错,而//TRANSLIT是截掉它不认识的字及其后面的内容,并且报错。//IGNORE是我需要的。
现在等待上线看结果(这样不是好的做法,继续琢磨手册,上网搜搜看),呵呵。。。

在网上找到下面这篇文章,发现mb_convert_encoding也可以,但效率比iconv差。


转换字符串编码iconv与mb_convert_encoding的区别

iconv — Convert string to requested character encoding(PHP 4 >= 4.0.5, PHP 5)
mb_convert_encoding — Convert character encoding(PHP 4 >= 4.0.6, PHP 5)

用法:
string mb_convert_encoding ( string str, string to_encoding [, mixed from_encoding] )
需要先启用 mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉

string iconv ( string in_charset, string out_charset, string str )
注意:
第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,
其中:
//TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符,
//IGNORE 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断。
Returns the converted string or FALSE on failure.

使用:
1. 发现iconv在转换字符"-"到gb2312时会出错,如果没有ignore参数,所有该字符后面的字符串都无法被保存。不管怎么样,这个"-"都无法转换成功,无法输出。另外mb_convert_encoding没有这个bug.
2. mb_convert_encoding 可以指定多种输入编码,它会根据内容自动识别,但是执行效率比iconv差太多;如:$str = mb_convert_encoding($str,"euc-jp","ASCII,JIS,EUC-JP,SJIS,UTF- 8");“ASCII,JIS,EUC-JP,SJIS,UTF-8”的顺序不同效果也有差异
3. 一般情况下用 iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding 函数

from_encoding is specified by character code name before conversion. it can be array or string - comma separated enumerated list. If it is not specified, the internal encoding will be used.

$str = mb_convert_encoding($str, "UCS-2LE", "JIS, eucjp-win, sjis-win");
$str = mb_convert_encoding($str, "EUC-JP', "auto");

例子:
$content = iconv("GBK", "UTF-8", $content);
$content = mb_convert_encoding($content, "UTF-8", "GBK");
分享到:
评论

相关推荐

    php使用iconv中文截断问题的解决方法

    文档中提到了在尝试转换过程中遇到的警告信息:“Notice: iconv(): Detected an illegal character in input string”。这意味着iconv在转换过程中遇到了不能识别的字符。问题的根源在于,当使用iconv函数进行转换时...

    iconv::rocket:纯正的Golang工具

    首先,有iconv.ConvertString(input,fromEncoding,toEncoding string)语法糖。 output , err := iconv . ConvertString ( "Hello World!" , iconv . GBK , iconv . UTF8 ) 另外,您可以创建一个转换器并使用...

    iconv:iconv 包装器

    iconv 包装器,曾经是 ext/iconv 抽象的 Iconv 是 UNIX 95 iconv()函数系列的包装类,用于在各种编码系统之间转换字符串。 有关更多详细信息,请参阅 Open Group 的在线文档。 iconv.h : iconv_open() : iconv...

    本人编译的iconv.so 与其头文件

    我在做一个加密芯片项目...1.如要iconv_open、iconv_close这样的名字,需在iconv.h中加入#define LIBICONV_PLUG即可。 2.如要libiconv_open、libiconv_close这样的名字,需在iconv.h中移除#define LIBICONV_PLUG即可。

    erlang lib of iconv

    Erlang库中的iconv是一个用于字符编码转换的模块,它是Erlang编程语言与不同字符集之间交互的重要工具。Erlang是一种并发性极强、适合构建分布式系统的动态类型语言,而iconv库则提供了在Erlang环境中处理字符串编码...

    iconv:Golang绑定到libiconv-将字符串转换为请求的字符编码

    iconv:libiconv进行 iconv是go的libiconv包装器。 libiconv将字符串转换为请求的字符编码。 文档 参见 注意:Open返回一个转换描述符cd,cd包含转换状态,不能同时在多个线程中使用。 安装 go get github....

    rust-iconv:Rust的libiconv绑定

    `rust-iconv`是Rust编程语言的一个库,它提供了对`libiconv`的绑定,使得Rust程序员能够方便地在他们的项目中处理字符编码转换。`libiconv`是一个广泛使用的开源软件库,由GNU项目开发,用于在不同字符集之间进行...

    connect-iconv:将字符编码转换为连接中间件

    《使用JavaScript实现字符编码转换:connect-iconv中间件详解》 在Web开发中,字符编码问题经常成为开发者头疼的问题。不同的系统、浏览器以及文件可能采用不同的字符编码,导致数据交换时可能出现乱码。为了解决这...

    polyfill-iconv:该组件提供php.neticonv函数的本地PHP实现。

    `polyfill-iconv` 是一个针对 PHP 的组件,它的主要目的是为 PHP 提供 `iconv` 函数的本地实现。`iconv` 函数在 PHP 中用于进行字符编码转换,它允许开发者在不同字符集之间转换字符串,如从 UTF-8 转换为 GBK 或 ...

    meteor-iconv:图标的流星包装器

    【meteor-iconv: 图标的流星包装器】是一个针对Meteor框架的扩展包,它为Meteor提供了对图标处理的支持。在 Meteor 应用开发中,我们经常需要处理各种图标,包括字体图标、图片图标等,meteor-iconv 提供了一个方便...

    php5.3.8 终极安装 /home/jjdai/work/zhupiter/php-5.2.0/ext/iconv/iconv.c:2419: undefi

    描述中提到的错误信息“/home/jjdai/work/zhupiter/php-5.2.0/ext/iconv/iconv.c:2419: undefined”是指在编译PHP源代码时,iconv扩展在2419行遇到了未定义的引用问题,可能是因为缺少了特定的库或头文件。...

    Android NDK使用Iconv进行编码转换

    public native String convertEncoding(String input, String srcEncoding, String destEncoding); ``` 5. **错误处理**: 在C/C++代码中,需要注意处理各种可能的错误,如编码不支持、内存不足、输入/输出缓冲区...

    windows下使用iconv转换编码 内附使用示例

    在Windows操作系统中,进行字符编码转换时,可能会遇到与Linux或Unix系统不同的情况,因为Windows原生并不包含iconv库。然而,为了满足跨平台的编码转换需求,开发者们为Windows构建了兼容iconv功能的实现。这个工具...

    iconv封装后的cpp接口,含iconv的lib、dll、h文件

    Iconv是一个广泛使用的字符编码转换库,主要用于在不同的字符编码之间进行转换,如从GBK转换到UTF-8。在这个压缩包中,包含了经过封装后的C++接口,使得开发者能够更方便地在C++项目中使用iconv功能。下面将详细介绍...

    iconv.h iconv.lib charset.lib

    标题中的"iconv.h iconv.lib charset.lib"指的是在编程过程中使用iconv库时所需的头文件和库文件。这些文件是实现字符集转换的关键组成部分,主要用于处理不同编码间的转换问题。 1. **iconv.h**: 这是一个C语言的...

    node-iconv:node.js iconv绑定-文本重新编码带来的乐趣和收益!

    节点图标 用JavaScript进行文本重新编码,带来乐趣和收益! 支持的编码 European languages ASCII, ISO-8859-{1,2,3,4,5,7,9,10,13,14,15,16}, KOI8-R, KOI8-U, KOI8-RU, CP{437,737,775,850,852,853,855,857,858...

Global site tag (gtag.js) - Google Analytics