php使用iconv进行从utf-8转为gb2312字符编码出错解决方案

原文:http://www.path8.net/tn/archives/2560


在php函数库有一个函数:iconv()

把gb2312置换成utf-8

$text=iconv("GB2312","UTF-8",$text);

在用$text=iconv("UTF-8","GB2312",$text)过程中,如果遇到一些特别字符时,如:"—",英文名中的"."等等字符,转换就断掉了。这些字符后的文字都没法继续转换了。

针对这的问题,可以用如下代码实现

$text=iconv("UTF-8","GBK",$text);

你没有看错,就这么简单,不使用gb2312,而写成GBK,就可以了。

还有一种方法:

第二个参数,加上//IGNORE,忽略错误,如下:

iconv("UTF-8","GB2312//IGNORE",$data);

没有具体比较这两种方法,感觉第一种(GBK代替gb2312)方法更好.

php手册中iconv() 说明

iconv

(PHP 4 >= 4.0.5, PHP 5)

iconv -- Convert string to requested character encoding

Description

string iconv ( string in_charset, string out_charset, string str )

Performs a character set conversion on the string str from in_charset to out_charset. Returns the converted string or FALSE on failure.

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.

例子 1. iconv() example:
<?php
echo iconv("ISO-8859-1", "UTF-8", "This is a test.");
?>

string iconv ( string $in_charset , string $out_charset , string $str )

在使用这个函数进行字符串编码转换时,需要注意,如果将utf-8转换为gb2312时,可能会出现字符串被截断的情况发生。

此时可以使用以下方法解决:

//author:zhxia
$str=iconv('utf-8',"gb2312//TRANSLIT",file_get_contents($filepath));

即在第二个参数出添加红色字部分,表示:如果在目标编码中找不到与源编码相匹配的字符,会选择相似的字符进行转换。

此处也可以使用://IGNORE 这个参数,表示忽略不能转换的字符。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个使用 Arduino 和 iconv 库将 UTF-8 编码换为 GB2312 编码的示例代码: ```C++ #include <iconv.h> // 导入 iconv 库 #include <string.h> void setup() { Serial.begin(9600); // 初始化串口 } void loop() { String utf8Str = "你好,世界!"; // 声明一个 UTF-8 编码字符串 char utf8Buf[32]; utf8Str.toCharArray(utf8Buf, utf8Str.length() + 1); // 将 UTF-8 字符换为字符数组 char gb2312Buf[32]; size_t utf8Len = strlen(utf8Buf); size_t gb2312Len = sizeof(gb2312Buf); iconv_t cd = iconv_open("GB2312", "UTF-8"); // 打开换句柄 iconv(cd, &utf8Buf, &utf8Len, &gb2312Buf, &gb2312Len); // 进行iconv_close(cd); // 关闭换句柄 String gb2312Str = String(gb2312Buf); // 将 GB2312 编码字符数组换为字符串 Serial.println(gb2312Str); // 输出换后的字符串 delay(1000); } ``` 在上面的代码中,我们首先使用 `String` 类型声明了一个 UTF-8 编码字符串,并将其换为字符数组。接着,我们声明了一个长度为 `32` 的字符数组 `gb2312Buf`,用于存储换后的 GB2312 编码。然后,我们使用 `iconv_open` 函数打开一个换句柄,并使用 `iconv` 函数进行换。最后,我们使用 `String` 类型将换后的字符数组换为字符串,并输出到串口。 需要注意的是,上述示例代码中的 GB2312 编码字符数组长度为 `32`,如果换后的字符串长度超过 `32`,则可能会导致内存溢出。因此,在实际应用中,需要根据换后的字符串长度来动态分配内存,以避免内存溢出的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值