就像我们现在一样,在PHP中处理多字节字符串并不容易.例如,我想得到以下字符串的长度:ä
strlen('ä'); // 2, because ä equals 2 bytes
mb_strlen('ä', 'UTF-8'); // 1
iconv_strlen('ä', 'UTF-8'); // 1
Run Code Online (Sandbox Code Playgroud)
我应该使用哪些功能?mb_*或iconv_*?为什么?考虑到编码可能不限于UTF-8.
Thx提前!
首先,我的数据库使用Windows-1250作为本机字符集.我输出的数据为UTF-8.我在我的网站上使用iconv()函数将Windows-1250字符串转换为UTF-8字符串,它完美无缺.
问题是当我使用PHP DOM来解析存储在数据库中的一些HTML时(HTML是WYSIWYG编辑器的输出而且无效,它没有html,head,body标签等).
HTML可能看起来像这样,例如:
<p>Hello</p>
Run Code Online (Sandbox Code Playgroud)
这是我用来从数据库中解析某个HTML的方法:
private function ParseSlideContent($slideContent)
{
var_dump(iconv('Windows-1250', 'UTF-8', $slideContent)); // this outputs the HTML ok with all special characters
$doc = new DOMDocument('1.0', 'UTF-8');
// hack to preserve UTF-8 characters
$html = iconv('Windows-1250', 'UTF-8', $slideContent);
$doc->loadHTML('<?xml encoding="UTF-8">' . $html);
$doc->preserveWhiteSpace = false;
foreach($doc->getElementsByTagName('img') as $t) {
$path = trim($t->getAttribute('src'));
$t->setAttribute('src', '/clientarea/utils/locate-image?path=' . urlencode($path));
}
foreach ($doc->getElementsByTagName('object') as $o) {
foreach ($o->getElementsByTagName('param') as $p) {
$path = trim($p->getAttribute('value'));
$p->setAttribute('value', '/clientarea/utils/locate-flash?path=' . urlencode($path));
}
}
foreach ($doc->getElementsByTagName('embed') as …Run Code Online (Sandbox Code Playgroud) 我正在尝试将字符串从iso-8859-1转换为utf-8.但当我发现这两个charachter€和•函数返回一个charachter,这是一个内部有两个数字的正方形.
我该如何解决这个问题?
当我在Xcode中执行"添加现有框架"时,我看到了三个版本的libiconv.
这个链接说最新最好的是1.13.1.我不认为它与上面的数字相同.
有线索吗?
与strpos()相反,iconv_strpos()的返回值是针前面出现的字符数,而不是找到针的位置的偏移量(以字节为单位).(来源:http://www.php.net/manual/en/function.iconv-strpos.php)
以下代码示例显示iconv_strpos()并strpos()返回相同的值.
$string = "dd.MM.yy";
echo "d: ".strpos($string, 'd'); // 0
echo "M: ".strpos($string, 'M'); // 3
echo "y: ".strpos($string, 'y'); // 6
echo "d: ".iconv_strpos($string, 'd'); // 0
echo "M: ".iconv_strpos($string, 'M'); // 3
echo "y: ".iconv_strpos($string, 'y'); // 6
Run Code Online (Sandbox Code Playgroud)
为什么我应该使用iconv_strpos而不是strpos?
我收到了一封使用charset的电子邮件iso-8859-8-i.iconv说这是一个不受支持的字符集.我试过使用iso-8859-8但是"无效的多字节序列"会出错.知道如何将此字符串转换为UTF-8吗?
我正在尝试用依赖于iconv的CMake构建一个库.我已经用Macports安装它,但每当我尝试构建库时,我都会收到以下错误:
Undefined symbols for architecture x86_64:
"_iconv", referenced from:
_mariadb_convert_string in my_charset.c.o
"_iconv_close", referenced from:
_mariadb_convert_string in my_charset.c.o
"_iconv_open", referenced from:
_mariadb_convert_string in my_charset.c.o
ld: symbol(s) not found for architecture x86_64
Run Code Online (Sandbox Code Playgroud)
我有一个FindIconv.cmake看起来正确的文件.怎么可能出错?
我需要将 CSV 文件转换为 UTF-8 并使用 PHP 脚本重命名它。
以下代码在我的 PC 上运行,但现在我需要在服务器上作为 CRON 任务执行此操作
iconv -f UTF-16LE -t UTF-8 OLD-FILE.csv > NEW-FILE.csv
任何人都知道 PHP 中的等价物。非常感谢。
我已经用Perl从数据库AS / 400 DB2中导入了一个表。
问题在于该字符串以EBCDIC Latin-1(意大利语)编码。
如何在Linux bash中将生成的文件转换为纯utf-8?
我正在使用带有PHP PDO的MS SQL Server 2008:我有一个PHP PDO类,它采用Windows字符集并手动将数据转换为UTF-8.就像是:
$sql = "SELECT * FROM something_somewhere);
$query = $this->db->query($sql);
$result = $query->fetchAll(PDO::FETCH_OBJ);
foreach ($result as $row) {
foreach (get_object_vars($row) as $key => $value) {
$row->$key = (mb_detect_encoding($value, mb_detect_order(), true) === 'UTF-8')
? $value : iconv('iso-8859-1', 'utf-8', $value);
}
$results[] = $row;
Run Code Online (Sandbox Code Playgroud)
}
iconv()效果很好,但是一直写这个很乏味.反正有没有配置FreeTDS转换为UTF-8?
我正在阅读关于Moodle的FreeTDS配置:
https://docs.moodle.org/22/en/FreeTDS
我当前的/etc/freetds.conf文件(不可编辑,所以我必须让管理员更改它):
# $Id: freetds.conf,v 1.12 2007/12/25 06:02:36 *** Exp $
#
# This file is installed by FreeTDS if no file by the same
# name is found in …Run Code Online (Sandbox Code Playgroud)