SlideShare a Scribd company logo
1 of 18
二つの iconv
base と ports の
二つの iconv について
2015 年 12 月 16 日
(株)創夢 内藤 祐一郎
iconv とは
● 汎用の文字コードコンバータ
➔ 例えば EUC-JP の文字列を UTF-8 へ変換するなど
● iconv(1)
➔ iconv -f euc-jp -t utf-8 <filename>
● iconv_open(3) iconv(3) iconv_close(3)
➔ Posix 規格
FreeBSD の対応
● FreeBSD 10.0-R から標準搭載
● 10.0 より前は ports の GNU iconv が事実上標準
● GNU iconv は 10.0 以降でも使用可能
● よって、 10 系では二つの iconv が使用可能
● 本資料では FreeBSD の iconv を「 base の iconv 」
● GNU iconv を「 ports の iconv 」とします
base の iconv
● CITRUS プロジェクト由来のもの
● BSD ライセンス
● NetBSD などでも使われている
● Posix 準拠
● libc に含まれる
➔ リンク時に -liconv が不要
➔ 逆を言うと外せない
ports の iconv
● GNU プロジェクト作成
● ライセンスは GPL
● Posix に準拠
● 独自拡張
➔ wchar_t 変換
➢ 後述
➔ transliteration
➢ いろいろな文字を英語文字だけで表すための変換
➢ 例えばギリシャ文字 θ を th にするなど
wchar_t 変換
● wchar_t はもともと C 言語の typedef 宣言
➔ 処理系により 2 バイトまたは 4 バイトで一文字を表す
➔ FreeBSD では int と同じで 4 バイトになる
● wchar_t 変換では文字列を wchar_t の配列にする
● そのため FreeBSD では必ず 4 バイト区切り
● バイトオーダは CPU 依存
● wchar_t が 4 バイトの場合 UTF-32 のコードを使用する
二つあると何が問題か?
● C 言語のシンボル名 (iconv_open など ) が重なるため両方
が存在して、かつ使い分けたい場合には小細工が必要
➔ ports の iconv.h を include する時にシンボル名を変え
てコンパイルする
➔ この小細工にバグがあった(詳細は後述)
● base の iconv では機能が足りないため、 ports の iconv を
使わなくてはならないことがある
➔ 特に wchar_t 変換を使用するアプリケーション
➔ ports の Makefile に USES+=iconv:wchar_t を入れる
シンボル名の変換
● 10.0 以降でかつ ports の iconv がインストールされている
と -DLIBICONV_PLUG をコンパイラに渡すようにする
➔ ports/Mk/Uses/iconv.mk
● LIBICONV_PLUG があると /usr/local/include/iconv.h でシ
ンボル名を libiconv に変更する
➔ iconv_open → libiconv_open
➔ iconv → libconv
➔ iconv_close → libiconv_close
➔ これらは ports の iconv で定義されている
シンボル名の変換
● 10.0 当時 iconvctrl のシンボルを未定義にしてしまうバグがあり、
コンパイル不能になる ports があった。
➔ https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=186563
➔ シンボル名の変換は GNU iconv の配布物に含まれている機能
● ICONV_PLUG を使わずに ports の iconv を強制するために
iconv:wchar_t を使用した。
➔ 動作と意味とが異なり表現が紛らわしい
➔ iconv:ports または iconv:gnu を別途作成すれば良かったと思う
● iconvctl を未定義にする問題は現時点で解決済み。
wchar_t 変換を使うアプリ
● そもそも wchar_t 変換を使うアプリはあるのか?
➔ ある
➔ ports/graphics/rawtherapee
➔ デジカメの RAW 画像現像( jpg 変換)ソフト
● http://lists.freebsd.org/pipermail/freebsd-ports/2014-February/0
➔ 10.0 で起動しなくなった
どこで wchar_t 変換を使うのか?
● rawtherapee は gtkmm を使うソフトウェア
● iconv を呼び出すまでの流れはだいたい次のとおり
➔ rawtherapee→gtkmm→pangomm→glibmm→glib→icon
v
● wchar_t を指定しているのは glibmm
● けれども、 iconv を直接呼び出すのは glib のため glib で
USES=iconv:wchar_t を付けることになった
なぜ wchar_t を使うのか?
● glibmm の内部では文字コードを wchar_t のバイト数に合
わせて UTF-32 または UTF-16 で統一しようとする
● glibmm-2.42.0/glib/glibmm/ustring.cc の中で wchar_t が4
バイトかつ __STDC_ISO_10646__ が定義されている場合
に処理系が UTF-32 を利用できると判断している
● そうでない場合に wchar_t へのコンバートを行う
● FreeBSD では __STDC_ISO_10646__ ではなく
__STDC_UTF_32__ を定義している
➔ https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=175930
パッチワーク
● glibmm の __STDC_ISO_10646__ を __STDC_UTF_32__
に書き換えてコンパイル&インストール
● glib の USES=iconv:wchar_t を USE=iconv に書き換えてコ
ンパイル&インストール
➔ rawtherapee は無事起動した
➔ firefox 、 libreoffice なども動作している
➔ mozc-server も USES=iconv で動作した
パッチ
● glibmm
➔ https://github.com/yuichiro-naito/iconv_research/blob/master
● glib20
➔ https://github.com/yuichiro-naito/iconv_research/blob/master
● mozc_server
➔ https://github.com/yuichiro-naito/iconv_research/blob/master
希望
● glibmm にパッチを当てて ports の iconv をなるべく不要に
したい
● ports の iconv を使用する時には USES=iconv:ports にした
い
➔ iconv:wchar_t は wchar_t 変換が必要な場合を意味する
ようにしたい
予想
● wchar_t 変換を使用するアプリはあまりない、はず?
● ports の Makefile を grep すると
➔ iconv:wchar_t のある ports の数は 20
➔ iconv:translit のある ports の数は 12
● glib を介して iconv を使用するものは上記に表れない
➔ glib20 を使用する ports の数は 556
➔ これらが wchar_t を使っていなければセーフ
➔ ちなみに glib20 かつ iconv だと 49 個
詳細リスト
● iconv:wchar_t のある ports
➔ https://github.com/yuichiro-naito/iconv_research/blob/master/wch
● iconv:tranlit のある ports
➔ https://github.com/yuichiro-naito/iconv_research/blob/master/tran
● glib20 を使用する ports
➔ https://github.com/yuichiro-naito/iconv_research/blob/master/glib2
● glib20&iconv を使用する ports
➔ https://github.com/yuichiro-naito/iconv_research/blob/master/glib_
お願い
一人で調べるのは大変なので
使っている ports が含まれていたら
パッチを当てて
動作するか試してもらえませんか?

More Related Content

What's hot

griffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jgguggriffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jggugkimukou_26 Kimukou
 
プロトコル拡張の話? #WWDC21cafe
プロトコル拡張の話? #WWDC21cafeプロトコル拡張の話? #WWDC21cafe
プロトコル拡張の話? #WWDC21cafeTomohiro Kumagai
 
Swift の可変値と不変値 #cocoa_kansai
Swift の可変値と不変値 #cocoa_kansaiSwift の可変値と不変値 #cocoa_kansai
Swift の可変値と不変値 #cocoa_kansaiTomohiro Kumagai
 
Windows で PHP をビルドしてみた
Windows で PHP をビルドしてみたWindows で PHP をビルドしてみた
Windows で PHP をビルドしてみたy-uti
 
JIT for PHP を試した
JIT for PHP を試したJIT for PHP を試した
JIT for PHP を試したy-uti
 
Webブラウザで使えるいろんな処理系
Webブラウザで使えるいろんな処理系Webブラウザで使えるいろんな処理系
Webブラウザで使えるいろんな処理系祐司 伊藤
 
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードPECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードy-uti
 
anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件y-uti
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftTomohiro Kumagai
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0Kiwamu Okabe
 
js-ctypes - ネイティブコードを呼び出す新しいカタチ
js-ctypes - ネイティブコードを呼び出す新しいカタチjs-ctypes - ネイティブコードを呼び出す新しいカタチ
js-ctypes - ネイティブコードを呼び出す新しいカタチMakoto Kato
 
第7回 カジュアル Swift 勉強会 @ 青葉台 オープニング #cswift
第7回 カジュアル Swift 勉強会 @ 青葉台 オープニング #cswift第7回 カジュアル Swift 勉強会 @ 青葉台 オープニング #cswift
第7回 カジュアル Swift 勉強会 @ 青葉台 オープニング #cswiftTomohiro Kumagai
 
PIAXで作る P2Pネットワーク
PIAXで作る P2PネットワークPIAXで作る P2Pネットワーク
PIAXで作る P2Pネットワーク祐司 伊藤
 
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム信之 岩永
 
MenohにおけるC++実装 / C API / C++API
MenohにおけるC++実装 / C API / C++APIMenohにおけるC++実装 / C API / C++API
MenohにおけるC++実装 / C API / C++APIShintarou Okada
 
Phpstudy44 Zend Frameworkが抱えている問題は多い。
Phpstudy44 Zend Frameworkが抱えている問題は多い。Phpstudy44 Zend Frameworkが抱えている問題は多い。
Phpstudy44 Zend Frameworkが抱えている問題は多い。sasezaki
 

What's hot (20)

Study Swift
Study Swift Study Swift
Study Swift
 
griffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jgguggriffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jggug
 
FlexUnit4とMockitoFlex
FlexUnit4とMockitoFlexFlexUnit4とMockitoFlex
FlexUnit4とMockitoFlex
 
20010901
2001090120010901
20010901
 
プロトコル拡張の話? #WWDC21cafe
プロトコル拡張の話? #WWDC21cafeプロトコル拡張の話? #WWDC21cafe
プロトコル拡張の話? #WWDC21cafe
 
Swift の可変値と不変値 #cocoa_kansai
Swift の可変値と不変値 #cocoa_kansaiSwift の可変値と不変値 #cocoa_kansai
Swift の可変値と不変値 #cocoa_kansai
 
Windows で PHP をビルドしてみた
Windows で PHP をビルドしてみたWindows で PHP をビルドしてみた
Windows で PHP をビルドしてみた
 
JIT for PHP を試した
JIT for PHP を試したJIT for PHP を試した
JIT for PHP を試した
 
Webブラウザで使えるいろんな処理系
Webブラウザで使えるいろんな処理系Webブラウザで使えるいろんな処理系
Webブラウザで使えるいろんな処理系
 
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードPECL operator で演算子オーバーロード
PECL operator で演算子オーバーロード
 
anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
 
js-ctypes - ネイティブコードを呼び出す新しいカタチ
js-ctypes - ネイティブコードを呼び出す新しいカタチjs-ctypes - ネイティブコードを呼び出す新しいカタチ
js-ctypes - ネイティブコードを呼び出す新しいカタチ
 
第7回 カジュアル Swift 勉強会 @ 青葉台 オープニング #cswift
第7回 カジュアル Swift 勉強会 @ 青葉台 オープニング #cswift第7回 カジュアル Swift 勉強会 @ 青葉台 オープニング #cswift
第7回 カジュアル Swift 勉強会 @ 青葉台 オープニング #cswift
 
PIAXで作る P2Pネットワーク
PIAXで作る P2PネットワークPIAXで作る P2Pネットワーク
PIAXで作る P2Pネットワーク
 
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム
 
MenohにおけるC++実装 / C API / C++API
MenohにおけるC++実装 / C API / C++APIMenohにおけるC++実装 / C API / C++API
MenohにおけるC++実装 / C API / C++API
 
Phpstudy44 Zend Frameworkが抱えている問題は多い。
Phpstudy44 Zend Frameworkが抱えている問題は多い。Phpstudy44 Zend Frameworkが抱えている問題は多い。
Phpstudy44 Zend Frameworkが抱えている問題は多い。
 

Similar to Two iconvs

OpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみたOpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみた徹 上野山
 
超簡単!バージョン管理入門 最初の一歩
超簡単!バージョン管理入門 最初の一歩超簡単!バージョン管理入門 最初の一歩
超簡単!バージョン管理入門 最初の一歩Shin Tanigawa
 
Monomeeting 20081022
Monomeeting 20081022Monomeeting 20081022
Monomeeting 20081022Atsushi Eno
 
Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性kozossakai
 
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮CODE BLUE
 
OpenCVを用いた画像処理入門
OpenCVを用いた画像処理入門OpenCVを用いた画像処理入門
OpenCVを用いた画像処理入門uranishi
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門sandai
 
cordova/electronの構造を知る
cordova/electronの構造を知るcordova/electronの構造を知る
cordova/electronの構造を知るYasuharu Seki
 
OWIN - .NETにおけるPSGI -
OWIN - .NETにおけるPSGI -OWIN - .NETにおけるPSGI -
OWIN - .NETにおけるPSGI -将 高野
 
Swiftからlibuvを呼び出すTIPS
Swiftからlibuvを呼び出すTIPSSwiftからlibuvを呼び出すTIPS
Swiftからlibuvを呼び出すTIPSjugemjugemjugem
 
HTML5-pronama-study
HTML5-pronama-studyHTML5-pronama-study
HTML5-pronama-studyNaoya Inada
 
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎Noriaki Ando
 
LibreOffice を Windows 上でビルドする UPDATE
LibreOffice を Windows 上でビルドする UPDATELibreOffice を Windows 上でビルドする UPDATE
LibreOffice を Windows 上でビルドする UPDATETomofumi Yagi
 
Swift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswiftSwift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswiftTomohiro Kumagai
 
静的解析Klocwork とJenkins CIの連携
静的解析Klocwork とJenkins CIの連携静的解析Klocwork とJenkins CIの連携
静的解析Klocwork とJenkins CIの連携Masaru Horioka
 

Similar to Two iconvs (20)

OpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみたOpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみた
 
超簡単!バージョン管理入門 最初の一歩
超簡単!バージョン管理入門 最初の一歩超簡単!バージョン管理入門 最初の一歩
超簡単!バージョン管理入門 最初の一歩
 
Monomeeting 20081022
Monomeeting 20081022Monomeeting 20081022
Monomeeting 20081022
 
Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性
 
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
 
OpenCVを用いた画像処理入門
OpenCVを用いた画像処理入門OpenCVを用いた画像処理入門
OpenCVを用いた画像処理入門
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
 
cordova/electronの構造を知る
cordova/electronの構造を知るcordova/electronの構造を知る
cordova/electronの構造を知る
 
20230128.pptx
20230128.pptx20230128.pptx
20230128.pptx
 
OWIN - .NETにおけるPSGI -
OWIN - .NETにおけるPSGI -OWIN - .NETにおけるPSGI -
OWIN - .NETにおけるPSGI -
 
Swiftからlibuvを呼び出すTIPS
Swiftからlibuvを呼び出すTIPSSwiftからlibuvを呼び出すTIPS
Swiftからlibuvを呼び出すTIPS
 
HTML5-pronama-study
HTML5-pronama-studyHTML5-pronama-study
HTML5-pronama-study
 
Word bench7月号
Word bench7月号Word bench7月号
Word bench7月号
 
SensorBeeのご紹介
SensorBeeのご紹介SensorBeeのご紹介
SensorBeeのご紹介
 
Linuxにおける開発環境
Linuxにおける開発環境Linuxにおける開発環境
Linuxにおける開発環境
 
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
 
LibreOffice を Windows 上でビルドする UPDATE
LibreOffice を Windows 上でビルドする UPDATELibreOffice を Windows 上でビルドする UPDATE
LibreOffice を Windows 上でビルドする UPDATE
 
Jenkinsstudy#4kokawa
Jenkinsstudy#4kokawaJenkinsstudy#4kokawa
Jenkinsstudy#4kokawa
 
Swift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswiftSwift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswift
 
静的解析Klocwork とJenkins CIの連携
静的解析Klocwork とJenkins CIの連携静的解析Klocwork とJenkins CIの連携
静的解析Klocwork とJenkins CIの連携
 

More from Yuichiro Naito

More from Yuichiro Naito (20)

Reporting AsiaBSDCon 2024 in Taipei for FreeBSD NetBSD
Reporting AsiaBSDCon 2024 in Taipei for FreeBSD NetBSDReporting AsiaBSDCon 2024 in Taipei for FreeBSD NetBSD
Reporting AsiaBSDCon 2024 in Taipei for FreeBSD NetBSD
 
Bmd
BmdBmd
Bmd
 
WireGurad in the FreeBSD kernel
WireGurad in the FreeBSD kernelWireGurad in the FreeBSD kernel
WireGurad in the FreeBSD kernel
 
FreeBSD Capsicum
FreeBSD CapsicumFreeBSD Capsicum
FreeBSD Capsicum
 
Xrdp
XrdpXrdp
Xrdp
 
Bhyve debug-server
Bhyve debug-serverBhyve debug-server
Bhyve debug-server
 
Tramp mode
Tramp modeTramp mode
Tramp mode
 
HandBrake with QSV
HandBrake with QSVHandBrake with QSV
HandBrake with QSV
 
FreeBSD 12.1 RELESE
FreeBSD 12.1 RELESEFreeBSD 12.1 RELESE
FreeBSD 12.1 RELESE
 
Modern fonts
Modern fontsModern fonts
Modern fonts
 
FreeBSD 12.0 RELEASE!
FreeBSD 12.0 RELEASE!FreeBSD 12.0 RELEASE!
FreeBSD 12.0 RELEASE!
 
Psql & proctitle
Psql & proctitlePsql & proctitle
Psql & proctitle
 
Iocage
IocageIocage
Iocage
 
FreeBSD 11.2 RELEASE!
FreeBSD 11.2 RELEASE!FreeBSD 11.2 RELEASE!
FreeBSD 11.2 RELEASE!
 
How to use PTI & IBRS patch
How to use PTI & IBRS patchHow to use PTI & IBRS patch
How to use PTI & IBRS patch
 
FreeBSD Desktop
FreeBSD DesktopFreeBSD Desktop
FreeBSD Desktop
 
FreeBSD Ports Flavors
FreeBSD Ports Flavors FreeBSD Ports Flavors
FreeBSD Ports Flavors
 
Bsdtw repo
Bsdtw repoBsdtw repo
Bsdtw repo
 
How to use blacklistd
How to use blacklistdHow to use blacklistd
How to use blacklistd
 
Custom Package Building with Poudriere
Custom Package Building with PoudriereCustom Package Building with Poudriere
Custom Package Building with Poudriere
 

Two iconvs

  • 1. 二つの iconv base と ports の 二つの iconv について 2015 年 12 月 16 日 (株)創夢 内藤 祐一郎
  • 2. iconv とは ● 汎用の文字コードコンバータ ➔ 例えば EUC-JP の文字列を UTF-8 へ変換するなど ● iconv(1) ➔ iconv -f euc-jp -t utf-8 <filename> ● iconv_open(3) iconv(3) iconv_close(3) ➔ Posix 規格
  • 3. FreeBSD の対応 ● FreeBSD 10.0-R から標準搭載 ● 10.0 より前は ports の GNU iconv が事実上標準 ● GNU iconv は 10.0 以降でも使用可能 ● よって、 10 系では二つの iconv が使用可能 ● 本資料では FreeBSD の iconv を「 base の iconv 」 ● GNU iconv を「 ports の iconv 」とします
  • 4. base の iconv ● CITRUS プロジェクト由来のもの ● BSD ライセンス ● NetBSD などでも使われている ● Posix 準拠 ● libc に含まれる ➔ リンク時に -liconv が不要 ➔ 逆を言うと外せない
  • 5. ports の iconv ● GNU プロジェクト作成 ● ライセンスは GPL ● Posix に準拠 ● 独自拡張 ➔ wchar_t 変換 ➢ 後述 ➔ transliteration ➢ いろいろな文字を英語文字だけで表すための変換 ➢ 例えばギリシャ文字 θ を th にするなど
  • 6. wchar_t 変換 ● wchar_t はもともと C 言語の typedef 宣言 ➔ 処理系により 2 バイトまたは 4 バイトで一文字を表す ➔ FreeBSD では int と同じで 4 バイトになる ● wchar_t 変換では文字列を wchar_t の配列にする ● そのため FreeBSD では必ず 4 バイト区切り ● バイトオーダは CPU 依存 ● wchar_t が 4 バイトの場合 UTF-32 のコードを使用する
  • 7. 二つあると何が問題か? ● C 言語のシンボル名 (iconv_open など ) が重なるため両方 が存在して、かつ使い分けたい場合には小細工が必要 ➔ ports の iconv.h を include する時にシンボル名を変え てコンパイルする ➔ この小細工にバグがあった(詳細は後述) ● base の iconv では機能が足りないため、 ports の iconv を 使わなくてはならないことがある ➔ 特に wchar_t 変換を使用するアプリケーション ➔ ports の Makefile に USES+=iconv:wchar_t を入れる
  • 8. シンボル名の変換 ● 10.0 以降でかつ ports の iconv がインストールされている と -DLIBICONV_PLUG をコンパイラに渡すようにする ➔ ports/Mk/Uses/iconv.mk ● LIBICONV_PLUG があると /usr/local/include/iconv.h でシ ンボル名を libiconv に変更する ➔ iconv_open → libiconv_open ➔ iconv → libconv ➔ iconv_close → libiconv_close ➔ これらは ports の iconv で定義されている
  • 9. シンボル名の変換 ● 10.0 当時 iconvctrl のシンボルを未定義にしてしまうバグがあり、 コンパイル不能になる ports があった。 ➔ https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=186563 ➔ シンボル名の変換は GNU iconv の配布物に含まれている機能 ● ICONV_PLUG を使わずに ports の iconv を強制するために iconv:wchar_t を使用した。 ➔ 動作と意味とが異なり表現が紛らわしい ➔ iconv:ports または iconv:gnu を別途作成すれば良かったと思う ● iconvctl を未定義にする問題は現時点で解決済み。
  • 10. wchar_t 変換を使うアプリ ● そもそも wchar_t 変換を使うアプリはあるのか? ➔ ある ➔ ports/graphics/rawtherapee ➔ デジカメの RAW 画像現像( jpg 変換)ソフト ● http://lists.freebsd.org/pipermail/freebsd-ports/2014-February/0 ➔ 10.0 で起動しなくなった
  • 11. どこで wchar_t 変換を使うのか? ● rawtherapee は gtkmm を使うソフトウェア ● iconv を呼び出すまでの流れはだいたい次のとおり ➔ rawtherapee→gtkmm→pangomm→glibmm→glib→icon v ● wchar_t を指定しているのは glibmm ● けれども、 iconv を直接呼び出すのは glib のため glib で USES=iconv:wchar_t を付けることになった
  • 12. なぜ wchar_t を使うのか? ● glibmm の内部では文字コードを wchar_t のバイト数に合 わせて UTF-32 または UTF-16 で統一しようとする ● glibmm-2.42.0/glib/glibmm/ustring.cc の中で wchar_t が4 バイトかつ __STDC_ISO_10646__ が定義されている場合 に処理系が UTF-32 を利用できると判断している ● そうでない場合に wchar_t へのコンバートを行う ● FreeBSD では __STDC_ISO_10646__ ではなく __STDC_UTF_32__ を定義している ➔ https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=175930
  • 13. パッチワーク ● glibmm の __STDC_ISO_10646__ を __STDC_UTF_32__ に書き換えてコンパイル&インストール ● glib の USES=iconv:wchar_t を USE=iconv に書き換えてコ ンパイル&インストール ➔ rawtherapee は無事起動した ➔ firefox 、 libreoffice なども動作している ➔ mozc-server も USES=iconv で動作した
  • 14. パッチ ● glibmm ➔ https://github.com/yuichiro-naito/iconv_research/blob/master ● glib20 ➔ https://github.com/yuichiro-naito/iconv_research/blob/master ● mozc_server ➔ https://github.com/yuichiro-naito/iconv_research/blob/master
  • 15. 希望 ● glibmm にパッチを当てて ports の iconv をなるべく不要に したい ● ports の iconv を使用する時には USES=iconv:ports にした い ➔ iconv:wchar_t は wchar_t 変換が必要な場合を意味する ようにしたい
  • 16. 予想 ● wchar_t 変換を使用するアプリはあまりない、はず? ● ports の Makefile を grep すると ➔ iconv:wchar_t のある ports の数は 20 ➔ iconv:translit のある ports の数は 12 ● glib を介して iconv を使用するものは上記に表れない ➔ glib20 を使用する ports の数は 556 ➔ これらが wchar_t を使っていなければセーフ ➔ ちなみに glib20 かつ iconv だと 49 個
  • 17. 詳細リスト ● iconv:wchar_t のある ports ➔ https://github.com/yuichiro-naito/iconv_research/blob/master/wch ● iconv:tranlit のある ports ➔ https://github.com/yuichiro-naito/iconv_research/blob/master/tran ● glib20 を使用する ports ➔ https://github.com/yuichiro-naito/iconv_research/blob/master/glib2 ● glib20&iconv を使用する ports ➔ https://github.com/yuichiro-naito/iconv_research/blob/master/glib_