酒井です。

From: takuma ozawa <deathmetal / azarasi.net>
Subject: [ruby-ext:01970] Re: WString の multi-locale
Date: Fri, 16 Nov 2001 02:26:32 +0900

> ありがとうございます。wstring-sysfail.diffとwstring-makestring.diffは、
> すでに取り込みました。multi-locale対応も、Exception Safetyの関係でコード
> がかなり苦しくなってしまいましたが、すでにできています。

multi-locale対応ありがとうございます。
大変だったでしょう。お疲れ様でした。

> > wstring-wcswidth.diff
> >   文字列の幅を取得するwcswidthという関数へのインターフェースです。
> >   XPG5では定義されていますが、ISO Cでは定義されていないので、
> >   あんましポータブルじゃありませんが…
> 
> これはどのようなときに使うのでしょうか?

int wcswidth(const wchar_t *pwcs, size_t n);
はpwcsの最初のn文字のターミナル出力幅(カラム数)を調べる関数です。
(文字列がn文字よりも短い場合はその長さだけしか調べない)
ただし、表示可能でないワイド文字が検出された場合は-1を返します。

例えば、
 wcswidth(L"abcd", 100) == 4
 wcswidth(L"こんにちは", 4) == 8
 wcswidth(L"\n", 1) == -1
のように振舞うはずです。

> それと、このまえのパッチについてですが、locale=は実装しちゃっても問題な
> いですか?LOCALE_INDEPENDENT_WCHAR_Tが#if 0になっていますが…。

この「#if 0」は外してしまっても、_問題は_無いはずです。
# ただ、僕自身は、wchar_tはCSI(CodeSet Independent)を保ったまま
# 内部で文字列処理をするための抽象度の高いAPIだと思っているので、
# locale=や下のto_utf8,to_utf16のようなAPIは好みではないです。
# (「#if 0」で囲っておいたのもそれが理由)

> あと、to_utf8とかto_utf16を実装したいのですが(というか、もうしたのです
> が)、ワイド文字列にUnicodeが使われるかは
> #if defined(__STDC_ISO_10646__) || defined(_WIN32)
> で判定すればいいですか?

コンパイル時の判定はとりあえずそれで良いと思います。
僕はLinuxとWindows以外のOSについて良く知らないので
他にも加える必要があるかも知れませんが…

ところで、to_utf16もStringオブジェクトを返すのでしょうか?

> #UStringを作るべき?

個々の文字集合やエンコーディングについては
個別にクラスを作るよりも、ruby_m17nのフレームワーク上で
サポートする事を考えた方が良いと思います。

-- さかい