cht電腦資訊LanguageC/C++
adm Find login register

GCC wide character (UTF-16) & iconv

eliu
1 GCC wide character (UTF-16) & iconv
Promote 0 Bookmark 02009-06-16quote  

不知道是哪裡出問題。iconv 的結果錯誤,UTF-16 轉成 UTF-8 只顯示出"中"一個字,應該可以顯示"中文測試"。

麻煩幫忙測測看其他的版本有沒有問題。我的是 GCC 4.2.3 + glibc-2.7-12.2mnb1


#include <stdio.h>
#include <wchar.h>
#include <stdlib.h>
#include <string.h>
#include <iconv.h>


wchar_t tt[128]=L"中文測試     ";

main()
{
  int rn=-1, wn=-1;

 iconv_t ic = iconv_open("UTF-8", "UTF-16");
  char *r = (char *)tt;
  rn = 12;
  char utf8[512];
  char *w = utf8;
  wn = sizeof(utf8);
  printf("r:%x rn:%d wn:%x:%d\n",r, rn, w, wn);
  int sz;
  sz=iconv(ic, &r, &rn, &w, &wn);
  printf("r:%x rn:%d sz:%d wn:%x:%d\n", r, rn, sz, w, wn);

  printf("rn:%d wn:%d  len:%d\n", rn, wn, strlen(utf8));
  printf("%s\n",utf8);
}

edited: 4
本人已不在此站活動
2 GCC wide character (UTF-16) & iconv
Promote 0 Bookmark 02009-06-16quote  

eliu
wchar_t tt[128]=L"中文測試     ";

這些 string 應該要用什麼編碼?

我是亂問的 :P,這裡好像有一個例子:

 http://www.gnu.org/software/libc/manual/html_node/iconv-Examples.html#iconv-Examples

 

eliu
3
Promote 0 Bookmark 02009-06-16quote  

wchar_t 就是 UTF-16

是因為發現 iconv UTF-16 轉 UTF-8 有問題。我原來是用 GTK 的g_convert,也一樣有問題,因為似乎也是 call iconv。g_convert 我以前用過,所以應該不是使用方式錯誤。

也可能是 GCC 的 UTF-16 string 有問題。可以幫我試一下找出問題嗎?

edited: 2
本人已不在此站活動
4
Promote 0 Bookmark 02009-06-16quote  

eliu
是因為發現 iconv UTF-16 轉 UTF-8 有問題。我原來是用 GTK 的g_convert,也一樣有問題,因為似乎也是 call iconv

我用可執行檔 iconv 來轉是沒有問題,所以,應該是有某顆地雷沒有發現?

eliu
5
Promote 0 Bookmark 02009-06-16quote  
本人已不在此站活動
6
Promote 0 Bookmark 02009-06-16quote  

eliu
是轉成 UTF-16 再轉回 UTF-8 嗎?

是的。

guest
7 error
Promote 0 Bookmark 02009-06-16quote  

# ./a.out

r:600b60 rn:12 wn:18391ad0:512

程式記憶體區段錯誤

 # dmesg

a.out[12964]: segfault at 601000 ip 00007f72f09c6a9b sp 00007fff183918f0 error 4 in UTF-16.so[7f72f09c6000+3000]

eliu
8
Promote 0 Bookmark 02009-06-16quote  

可以用 gcc -g compile 後用 gdb 看是當在哪一行嗎?

會搞這個都是那個 M$ 的 Visual Studio C++害的

edited: 2
企鵝狂
9
Promote 0 Bookmark 02009-06-16quote  

gcc iconv.c  -fwide-exec-charset=utf-16 -w

我不知道是怎麼回事喔,iconv.c是UTF-8,直接複製貼上。

我本來想說,用iconv 把iconv.c轉成utf16之後, gcc加上 -finput-charset=utf16, 可是這樣連stdio.h之類的都會錯了,因為utf16跟ISO8859不相容。

所以,-finput-charset不知道拿來幹嘛用的...可能是要甚麼都沒有include的獨立檔案才可以用這個flag吧。

eliu
10
Promote 0 Bookmark 02009-06-16quote  
企鵝狂
我本來想說,用iconv 把iconv.c轉成utf16之後, gcc加上 -finput-charset=utf16, 可是這樣連stdio.h之類的都會錯了,因為utf16跟ISO8859不相容。

不是這樣弄的,請把 file 存成 UTF-8 來 compile

wchar_t tt[128]=L"中文測試     "; 

L  是說把 string 存成 UTF-16,好像是 visual C++ 來的。

wchar_t 就是 wide character,也就是 UTF-16

edited: 2
企鵝狂
11
Promote 2 Bookmark 22009-06-16quote  

有阿,存成utf8 

gcc iconv.c  -fwide-exec-charset=utf-16 -w

這樣就可以了

eliu
12
Promote 0 Bookmark 02009-06-16quote  

感謝,真的可以了。

這樣看來 GCC 的 wide character default value 還真的有點爛,wide character string 只轉第一個字,造成誤會,比不轉更糟糕。Orz

edited: 1
ychao
13
Promote 0 Bookmark 02009-06-16quote  

eliu

這樣看來 GCC 的 wide character default value 還真的有點爛,wide character string 只轉第一個字,造成誤會,比不轉更糟糕。Orz

從wikipedia看來的:Under Win32, wchar_t is 16 bits wide and represents a UTF-16 code unit. On Unix-like systems wchar_t is commonly 32 bits wide and represents a UTF-32 code unit. 可是'試'出不來 :(  字元數忘記改,統統改成UTF-32就對了,所有字都出得來。

 http://en.wikipedia.org/wiki/Wide_character

edited: 1

cht電腦資訊LanguageC/C++
adm Find login register
views:45844