标签: iconv

PHP:将"'"字符从ISO-8859-1转换为UTF-8时出现问题

我在使用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)",我得到:

ASD

到现在为止还挺好.第一个输出包含那个奇怪的引用,我可以正确看到它,因为它在ISO-8859-1中,因此是Firefox.

将Firefox的编码设置更改为"UTF-8"后,它看起来像这样:

ASD

报价在哪里?是不是iconv()应该将其转换为UTF-8?

php utf-8 iso-8859-1 character-encoding iconv

5
推荐指数
1
解决办法
8869
查看次数

是否可以在 MSVC 中使用 gcc 编译库?

我有一个依赖于libiconv多个操作的项目。

iconv.lib为 Visual Studio 2008使用了预编译的二进制文件,但现在我不得不转向 Visual Studio 2010 并且没有更多的预编译二进制文件可用。

我决定自己编译它,但正如libiconv文档所述,MSVC 编译器没有官方支持。但是,我在某处读到gcc可以生成与 MSVC 编译器二进制兼容的静态库,只要二进制接口保留在C. 虽然这听起来很疯狂,但我试了一下,实际上几乎奏效了。

我编译了它,重命名libiconv.aiconv.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 版本总是以同样的错误失败。

我应该怎么做才能使这项工作?

c++ linker gcc iconv visual-studio

5
推荐指数
1
解决办法
3756
查看次数

为什么翻译不起作用?

setlocale(LC_ALL, 'en_US.UTF8');
$string= '???è????';
echo iconv('UTF-8', 'ASCII//TRANSLIT', $string);
Run Code Online (Sandbox Code Playgroud)

出错...

应该打印:myresume

php iconv

5
推荐指数
1
解决办法
2280
查看次数

为什么PHP的iconv需要setlocale?

我正在尝试从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

php locale iconv

5
推荐指数
1
解决办法
3916
查看次数

在Windows上将c ++ dll与Haskell-Platform链接,输出'undefined reference'

我是Haskell的狂热爱好者,并且一直坚持在Windows上编译我的小Haskell程序.我的程序使用iconv包,后者又使用用c/c ++编写的外部库.为了让事情有效我有:

  • 运行GNU-Iconv设置并将'bin'文件夹添加到PATH 变量中,其中'libiconv-2.dll'和'libiconv2.dll'位于该文件夹中.
  • 将"LibIconv开发人员文件"提取并复制到Haskell平台位置的"mingw"文件夹中.
  • 然后'cabal install iconv'编译,我安装了cabal包.

现在,当我尝试在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'文件,但我对它知之甚少,所以任何帮助都将非常感激.

gcc haskell mingw iconv

5
推荐指数
1
解决办法
915
查看次数

修复非相干编码的文本文件的编码

我有一个很长的文本文件,在后续的文本块(iso或utf-8)中使用明显不同的编码.它是使用文本附加文本>> file.bib并从不同来源(网页)复制和粘贴的结果.

原则上可以区分这些块,因为它们是bibtex条目

 @article{key, author={lastname, firstname}, ...}
Run Code Online (Sandbox Code Playgroud)

我想将它转换为一个连贯的utf-8文件,因为它似乎崩溃了我的bibtex查看器(kbibtex).我知道我可以iconv用来转换整个文件的编码,但我想知道是否有办法修复我的文件而不破坏一些条目.

linux perl bibtex character-encoding iconv

5
推荐指数
1
解决办法
2890
查看次数

在Windows上使用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)

php windows locale iconv

5
推荐指数
1
解决办法
541
查看次数

如何使用iconv(3)将宽字符串转换为UTF-8?

我正在尝试使用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)

c linux unicode utf-8 iconv

5
推荐指数
1
解决办法
8191
查看次数

在Linux上转换UTF-8和ISO-8859之间的文件

每当我遇到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)

但显然这不起作用.

linux iconv

5
推荐指数
1
解决办法
7304
查看次数

使用libiconv时iconv将重音符号与字母分开

我正在尝试制作一个函数,该函数将返回不带重音的给定字符串,但是iconv的//TRANSLIT选项似乎只将重音和字母分开,而没有去除重音。

这是我的功能:

<?php
function strRemoveAccents($str)
{
    return iconv(mb_detect_encoding($str), 'us-ascii//TRANSLIT', $str);
}
Run Code Online (Sandbox Code Playgroud)

这是我的结果:

  • 测试1

    • 输入:雅典
    • 预期产量:雅典娜
    • 电流输出:Ath`enes
  • 测试2

    • 输入:Gda?sk
    • 预期产量:格但斯克
    • 电流输出:格达斯克
  • 测试3

    • 输入:niño
    • 预期产量:nino
    • 电流输出:ni〜no

一些精度:

  • mb_detect_encoding 对于我的所有测试,返回“ UTF-8”,并且用返回值替换该函数不会更改任何内容。
  • 我的语言环境当前设置为 LC_COLLATE=C;LC_CTYPE=French_France.1252;LC_MONETARY=C;LC_NUMERIC=C;LC_TIME=C
  • 我也尝试将语言环境更改为en_US.UTF-8(我检查过:语言环境已成功更新),但是函数的返回值仍然相同
  • 在Macbook上使用默认语言环境设置测试c/fr_FR.UTF-8/c/c/c/c的问题仍然相同。
  • 我可以删除重音符号,但是由于我将在整个句子中使用该方法,因此我不想删除多余的撇号。
  • 编辑:使用此沙箱进行测试时,我得到了想要的结果。

我可能会丢失一些东西,但我看不到。

编辑:正如@jasonwubz在回答中提到的那样,仅在使用libinconv时出现问题,而在使用glibc时不存在。使用这些实现中的任何一种时,是否有办法使其工作?

php character-encoding iconv

5
推荐指数
2
解决办法
120
查看次数

标签 统计

iconv ×10

php ×5

character-encoding ×3

linux ×3

gcc ×2

locale ×2

utf-8 ×2

bibtex ×1

c ×1

c++ ×1

haskell ×1

iso-8859-1 ×1

linker ×1

mingw ×1

perl ×1

unicode ×1

visual-studio ×1

windows ×1