我在使用PHP将ISO-8859-1数据库内容转换为UTF-8时遇到了一些问题.我正在运行以下代码来测试:
// Connect to a latin1 charset database
// and retrieve "Georgia O’Keeffe", which contains a "’" character
$connection = mysql_connect('*****', '*****', '*****');
mysql_select_db('*****', $connection);
mysql_set_charset('latin1', $connection);
$result = mysql_query('SELECT notes FROM categories WHERE id = 16', $connection);
$latin1Str = mysql_result($result, 0);
$latin1Str = substr($latin1Str, strpos($latin1Str, 'Georgia'), 16);
// Try to convert it to UTF-8
$utf8Str = iconv('ISO-8859-1', 'UTF-8', $latin1Str);
// Output both
var_dump($latin1Str);
var_dump($utf8Str);
Run Code Online (Sandbox Code Playgroud)
当我在Firefox的源视图中运行它时,确保Firefox的编码设置设置为"Western(ISO-8859-1)",我得到:

到现在为止还挺好.第一个输出包含那个奇怪的引用,我可以正确看到它,因为它在ISO-8859-1中,因此是Firefox.
将Firefox的编码设置更改为"UTF-8"后,它看起来像这样:

报价在哪里?是不是iconv()应该将其转换为UTF-8?
我有一个依赖于libiconv多个操作的项目。
我iconv.lib为 Visual Studio 2008使用了预编译的二进制文件,但现在我不得不转向 Visual Studio 2010 并且没有更多的预编译二进制文件可用。
我决定自己编译它,但正如libiconv文档所述,MSVC 编译器没有官方支持。但是,我在某处读到gcc可以生成与 MSVC 编译器二进制兼容的静态库,只要二进制接口保留在C. 虽然这听起来很疯狂,但我试了一下,实际上几乎奏效了。
我编译了它,重命名libiconv.a为iconv.lib并尝试与它链接。(如果这是一个坏主意,请告诉我)。
首先我遇到了一个链接错误:
1>iconv.lib(iconv.o) : error LNK2001: unresolved external symbol ___chkstk
Run Code Online (Sandbox Code Playgroud)
经过一番研究,我重新编译libiconv(在 x86 和 x64 版本中),添加了-static-libgcc标志。
它有效,但仅适用于我的程序的 x64 版本。x86 版本总是以同样的错误失败。
我应该怎么做才能使这项工作?
setlocale(LC_ALL, 'en_US.UTF8');
$string= '???è????';
echo iconv('UTF-8', 'ASCII//TRANSLIT', $string);
Run Code Online (Sandbox Code Playgroud)
出错...
应该打印:myresume
我正在尝试从UTF-8字符串中删除所有特殊字符和重音符号,如果可能的话将它们转换为等效的ASCII字符.
所以我只是使用这段代码:
$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input);
Run Code Online (Sandbox Code Playgroud)
问题是例如单词"début"变成"dbut"而不是"debut".为了使它工作,我需要添加对setlocale的调用,如下所示:
setlocale(LC_ALL, 'en_US.UTF8');
$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input);
Run Code Online (Sandbox Code Playgroud)
我不明白为什么.我认为UTF-8和ASCII总是相同的,无论你使用哪种语言环境.
编辑:我不是说UTF-8等于ASCII,我的意思是UTF-8总是等于UTF-8,ASCII总是等于ASCII
我是Haskell的狂热爱好者,并且一直坚持在Windows上编译我的小Haskell程序.我的程序使用iconv包,后者又使用用c/c ++编写的外部库.为了让事情有效我有:
PATH
变量中,其中'libiconv-2.dll'和'libiconv2.dll'位于该文件夹中.现在,当我尝试在Leksah中构建我的模块时,我从'GHC'获得以下消息:
Building norms-parser-0.0.1...
Linking dist\build\norms-parser\norms-parser.exe ...
C:\Documents and Settings\kdv\Application Data\cabal\iconv-0.4.1.0\ghc-7.0.4/libHSiconv-0.4.1.0.a(hsiconv.o):hsiconv.c:(.text+0x7): undefined reference to `_imp__libiconv_open'
C:\Documents and Settings\kdv\Application Data\cabal\iconv-0.4.1.0\ghc-7.0.4/libHSiconv-0.4.1.0.a(hsiconv.o):hsiconv.c:(.text+0x17): undefined reference to `_imp__libiconv'
C:\Documents and Settings\kdv\Application Data\cabal\iconv-0.4.1.0\ghc-7.0.4/libHSiconv-0.4.1.0.a(hsiconv.o):hsiconv.c:(.text+0x27): undefined reference to `_imp__libiconv_close'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
有了'GHCi',我也面临一个问题:
ghc.exe: unable to load package `iconv-0.4.1.0'
ghc.exe: C:\Documents and Settings\kdv\Application Data\cabal\iconv-0.4.1.0\ghc- 7.0.4\HSiconv-0.4.1.0.o: unknown symbol `__imp__libiconv_open'
Run Code Online (Sandbox Code Playgroud)
我认为可能的解决方案是将c/c ++头文件正确设置为'mingw'文件夹并将PATH变量设置为'lib'文件,但我对它知之甚少,所以任何帮助都将非常感激.
我有一个很长的文本文件,在后续的文本块(iso或utf-8)中使用明显不同的编码.它是使用文本附加文本>> file.bib并从不同来源(网页)复制和粘贴的结果.
原则上可以区分这些块,因为它们是bibtex条目
@article{key, author={lastname, firstname}, ...}
Run Code Online (Sandbox Code Playgroud)
我想将它转换为一个连贯的utf-8文件,因为它似乎崩溃了我的bibtex查看器(kbibtex).我知道我可以iconv用来转换整个文件的编码,但我想知道是否有办法修复我的文件而不破坏一些条目.
在Linux上iconv()根据当前的语言环境设置将解码符正确地音译为ASCII:
$utf8_umlaut_a = 'ä';
setlocale(LC_CTYPE, 'en_US');
iconv('UTF-8', 'ASCII//TRANSLIT', $utf8_umlaut_a); // Gives 'a'
setlocale(LC_CTYPE, 'de_DE');
iconv('UTF-8', 'ASCII//TRANSLIT', $utf8_umlaut_a); // Gives 'ae', correct
// in German
Run Code Online (Sandbox Code Playgroud)
但是,在Windows上,我只能获得"a(即:双引号,a),无论区域设置如何.显然在Windows上,语言环境被命名为"english"和"german",但是:
setlocale(LC_CTYPE, 'german');
iconv('UTF-8', 'ASCII//TRANSLIT', $utf8_umlaut_a); // Still gives '"a'
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用iconv(3)将宽字符串转换为UTF-8,使用下面的代码.当我运行下面的命令时,iconv调用返回E2BIG,就好像输出缓冲区中没有足够的可用空间字节一样.尽管事实上(我认为)我确定了输出缓冲区的大小以承认UTF-8的最坏情况扩展,但仍会发生这种情况.实际上,假设输入是一个简单的ASCII"A"编码为wchar_t后跟一个零wchar_t终结符,输出应该是两个字节/字符:一个'A'后跟一个'\ 0'.
我的Linux系统上的'man utf-8'表示UTF-8字节序列的最大长度是6个字节,所以我相信对于2个wchar_ts的输入缓冲区(一个字符后跟空终止符),make(on我的系统)总共8个字节(因为sizeof(wchar_t)== 4),12个字节的缓冲区(2*UTF8_SEQUENCE_MAXLEN)就足够了.
通过实验,如果我将UTF8_SEQUENCE_MAXLEN增加到16,则iconv的返回值表示成功(15仍然失败).但是当我用UTF-8编码时,我无法看到任何wchar_t值会占用如此多的字节.
我的计算出错了吗?16字节的UTF-8序列是否可行?我做错了什么?
#include <stdio.h>
#include <stdlib.h>
#include <iconv.h>
#include <wchar.h>
#define UTF8_SEQUENCE_MAXLEN 6
/* #define UTF8_SEQUENCE_MAXLEN 16 */
int
main(int argc, char **argv)
{
wchar_t *wcs = L"A";
signed char utf8[(1 /* wcslen(wcs) */ + 1 /* L'\0' */) * UTF8_SEQUENCE_MAXLEN];
char *iconv_in = (char *) wcs;
char *iconv_out = (char *) &utf8[0];
size_t iconv_in_bytes = (wcslen(wcs) + 1 /* L'\0' */) * sizeof(wchar_t);
size_t iconv_out_bytes = sizeof(utf8);
size_t ret;
iconv_t cd;
cd = iconv_open("WCHAR_T", …Run Code Online (Sandbox Code Playgroud) 每当我遇到Unicode时,都没有用.我在Linux上,我从Windows获得这些文件:
$file *
file1: UTF-8 Unicode text
file2: ISO-8859 text
file3: ISO-8859 text
Run Code Online (Sandbox Code Playgroud)
在我发现文件有不同的编码之前,没有任何工作.我希望让我的生活变得轻松,并将它们全部放在相同的格式中:
iconv -f UTF-8 -t ISO-8859 file1 > test
iconv: conversion to `ISO-8859' is not supported
Try `iconv --help' or `iconv --usage' for more information.
Run Code Online (Sandbox Code Playgroud)
我试图转换为ISO,因为那只有1次转换+当我在gedit中打开那些ISO文件时,德语字母"ü"显示得很好.好的,接下来尝试:
iconv -f ISO-8859 -t UTF-8 file2 > test
iconv: conversion from `ISO-8859' is not supported
Try `iconv --help' or `iconv --usage' for more information.
Run Code Online (Sandbox Code Playgroud)
但显然这不起作用.
我正在尝试制作一个函数,该函数将返回不带重音的给定字符串,但是iconv的//TRANSLIT选项似乎只将重音和字母分开,而没有去除重音。
这是我的功能:
<?php
function strRemoveAccents($str)
{
return iconv(mb_detect_encoding($str), 'us-ascii//TRANSLIT', $str);
}
Run Code Online (Sandbox Code Playgroud)
这是我的结果:
测试1
测试2
测试3
一些精度:
mb_detect_encoding 对于我的所有测试,返回“ UTF-8”,并且用返回值替换该函数不会更改任何内容。LC_COLLATE=C;LC_CTYPE=French_France.1252;LC_MONETARY=C;LC_NUMERIC=C;LC_TIME=Cen_US.UTF-8(我检查过:语言环境已成功更新),但是函数的返回值仍然相同c/fr_FR.UTF-8/c/c/c/c的问题仍然相同。我可能会丢失一些东西,但我看不到。
编辑:正如@jasonwubz在回答中提到的那样,仅在使用libinconv时出现问题,而在使用glibc时不存在。使用这些实现中的任何一种时,是否有办法使其工作?