[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:991] multibyte character problem (Re: [Mew-dist 07589] Re: user meeting?)



かなり厄介な問題です。
Meadow develop行きにまわします。

kyota@xxxxxxxxxxxxx (Kyotaro HORIGUCHI) writes:

>  問題はとりあえず Meadow 1.00/1.01 では w32.c にありました.
> 
>  むちゃくちゃやっつけですが添付のパッチのような修正をすることで 
> 
>    ・file-name-all-completions, file-name-completion は(多分^^;)
>      期待通りの動作になっていると思います.
> 
>    ・ あと, find-file などで c:/temp/表 といったファイル名もちゃ
>      んと読みこめるようになっています.
> 
>  ただし, ほかにも怪しいところがあるのを放っておいてあるところがあ
> るのでこのままおひぃしゃるなりリースに加えることはできないと思い
> ます.

まず、w32.cがOS analogous moduleというのが、事態をかなり難しくしています。
おそらく、堀口さんは気づかれているんだと思いますが、w32.cに渡されるstringは
基本的にWindows(OS)に渡されるものとと同等です。すなわち、Windowsと等価な
振る舞いをすることが求められます。

しかし、EmacsはMule Internal code以外のStringを扱うことが出来ません。
したがって、w32.cの実装は、かなり問題を抱えています。
(今まで気づかなかったのが情けないですが)

さて、このような状況を鑑みると、OSレイヤによるAPIを用いたString操作で
処理する以外の手は、あまり現実的ではありません。なぜなら、受け取る
Stringの詳細は、w32.cモジュールには判断不能であるからです。

もちろん、再度encode & decodeを繰り返すという手もあるのですが、
この方法は、w32.cモジュールが、Emacsのモジュールに浸潤するという点から、
あまり望ましい方法ではありません。EmacsのFunctionは、呼び出す側に制限が
多く、どこから呼び出されるかわからないw32.cから呼び出すことは極めて
危険な行為です。

さて、Windowsが提供するString 操作APIもしくはLibraryは大きく分けて以下
の2種類が存在します。


1.... Win32 API International Feature
2.... Microsoft Visual C++ Runtime Library(MSVCRT)

1は、Windowsの持つ、SetLocaleInfo()によって制御されます。
2は、Runtime Libraryの持つ setlocale()によって制御されます。

2を用いるのが堀口さんの方法です。しかし、この方法はあまり薦められません。
理由は、MSVCRTは、(1) W APIへ対応させるためにはLibraryをリンクさせ直す必要が生じる
(2)コードの品質があまり良くない、という点にあります。また、将来的にはsetlocal()を用いて
管理を行う必要が生じます。

これらのことを総合して考えると、2を用いたw32.cのかなりの部分の書き換えが必要になることが
わかります。また、w32.cはどう見てもWin32 APIが管理するデータに土足で踏み込んでいる設計に
なっていて、いただけない個所が多々あります。

したがって、以下の関数の、全面的な書き換えを予定します。問題は時間なんですが、
手伝ってくださる方は歓迎します。

get_long_basename()     
w32_get_long_filename()

以上の2つは、廃止。FindFirstFile FindNextFileで置き換え。

normalize_filename()
parse_root()
is_unc_volume()
get_volume_info()
map_w32_filename()
stat()
file_attribute_stat()

これらは、すべて、Win32 APIによるString操作に切り替える。
具体的には以下の関数群を用いる。
-----------------------------------------
CharLower  
CharLowerBuff  
CharNext  
CharNextExA  
CharPrev  
CharPrevExA  
CharToOem  
CharToOemBuff  
CharUpper  
CharUpperBuff  
CompareString  
FoldString  
FormatMessage  
GetStringTypeA  
GetStringTypeEx  
GetStringTypeW  
IsCharAlpha  
IsCharAlphaNumeric  
IsCharLower  
IsCharUpper  
IsDBCSLeadByte  
IsTextUnicode  
IsValidCodePage  
IsValidLocale  
LCMapString  
lstrcat  
lstrcmp  
lstrcmpi  
lstrcpy  
lstrcpyn  
lstrlen  
MultiByteToWideChar  
OemToChar  
OemToCharBuff  
WideCharToMultiByte  
wsprintf  
wvsprintf  
-----------------------------------------

from himi