[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-devel:13813] Re: iconv()



おかもとです。

取り敢えず、iconv 情報ということで...

xxx -> utf-16 への変換で、glibc2.1 と glibc2.2 で違いがあるらしいです。
glibc 2.2 では、BOM と呼ばれるものが、最初の2byteに追加されていて、それ
で Big endian と Little endian を区別できます。

それが嫌な場合は、utf-16be とか、utf-16le を使えば良いようです。ただし、
glibc <=2.1.x では utf-16be と utf-16le は使えませんし、BOM もありませ
ん。
(BOM については、unicode3.0のドキュメントに何か書いていたような...(忘))


あと、Shift_JIS から unicode への変換では、

   TILDA ('~', U+007E) -> OVERLINE (U+203E).
   BACKSLASH ('\', U+005C)  -> YEN (U+00A5).

となったりするので、注意が必要ですね。

# 実は、既にこの辺りの話しは何処かに書いてある?
# もし誰かまとめるのなら、この辺りの情報もまとめて欲しい...


あと、iconv を使って、1文字づつ文字を変換する方法はないんですかね?
一応、下記のような感じでは可能なのですが(xxx -> utf-16 への変換の場
合)....

      size_t   chl  = 2;
      size_t   srcl = 8; // ここが決めうちなので納得できない
      size_t n = iconv(converter,
                       (char **)
                       &source_ptr, &srcl,
                      (char **)&chp, &chl
                  );
      // n == -1 がエラーとは限らない。
      // n == -1 かつ、出力文字を消費していないときエラー
      if(n == (size_t) -1 && chl == 2)
      {
          fprintf(stderr,"Charset conversion error at offset %d: ", int(before-buffer));
          exit(0);
      }
------------------------
岡本隆史