allocatorが異なるstring
typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, my_allocator<wchar_t> > my_wstring; std::wstring str1; my_wstring str2; str1 == str2; // error str1 < str2; // error str1 = str2; // error
うーん、不便。allocator が異なる場合でもこれらの関数は問題なく実装できると思うのですけれど。
OSX 流儀の IME オンオフ
最近 OSX に慣れてしまったので、Windows での IME のオンオフの流儀に違和感を覚えるようになってきてしまいました。
というわけで、そんな時に役に立つのが yamy や nodoka です。
keymap Global if ( KBD109 ) key *無変換 = &Ignore # 無変換を IME オフに key IL-*無変換 = $ToggleIME # 〃 key IC-C-K = F7 # IME で変換中の C-K は F7 key *変換 = &Ignore # 変換を IME オンに key ~IL-*変換 = $ToggleIME # 〃 if ( YAMY ) key *E0無変換 = &Ignore # 無変換を IME オフに key IL-*E0無変換 = $ToggleIME # 〃 endif endif
yamy の場合は、-DYAMY しておく必要があります。
〜‖−¢£¬
"〜‖−¢£¬" このあたりの文字で CP932 と SJIS と UNICODE 間で起こる問題、現在の libiconv-1.13.1 でもあいかわらず問題なのですね。未だに修正されていないのは、何か強い理由があるのかそれとも誰も本家にパッチをマージしようとしなかったのか。うーん。
CP932 さえ使っておけば安心と思っていたのでややショックです。glibc では問題は解消されているのでしょうか・・・?
cygwin 1.7.1 で ja_JP.CP932 を使用可能にするパッチ
以下のパッチを当てて cygwin-1.7.1-1 をビルドし、その結果作成される cygwin1.dll を使用して LANG=ja_JP.CP932 に設定しておけば、Subversion の global-ignores: *~ は問題なく動作するようになりました。
diff -c cygwin-1.7.1-1.orig/newlib/libc/locale/locale.c cygwin-1.7.1-1/newlib/libc/locale/locale.c *** cygwin-1.7.1-1.orig/newlib/libc/locale/locale.c 2009-10-20 17:16:33.001000000 +0900 --- cygwin-1.7.1-1/newlib/libc/locale/locale.c 2010-01-22 13:50:43.477347300 +0900 *************** *** 641,646 **** --- 641,653 ---- #endif /* _MB_EXTENDED_CHARSETS_WINDOWS */ #endif break; + case 932: + mbc_max = 2; + #ifdef _MB_CAPABLE + l_wctomb = __sjis_wctomb; + l_mbtowc = __sjis_mbtowc; + #endif + break; default: return NULL; }
(1/25追記) 上記パッチを送って (Nayuta Taga - Please support CP932. (I have problem using subversion with SJIS)) 採用されたので、cygwin-1.7.2 から CP932 がサポートされる予定です。ついでに ja_JP.SJIS の時に nl_langinfo(CODESET) が "CP932" を返すような変更も導入されました。
cygwin 1.7.1 で ja_JP.SJIS の時に subversion で global-ignores=*~ と指定しても効果がない
cygwin 1.7.1 を LANG=ja_JP.SJIS で使用している時に、~/.subversion/config に以下のような記述をしても効果がありません。
global-ignores = *~
少し調査してみた結果、ja_JP.SJIS 環境ではファイル名の ~ (U+007E TILDE) が ‾ (U+203E OVERLINE) へ化けるようですす。
ですので、とりあえずアドホックに回避するには以下のようにしておくと良いでしょう。
global-ignores = *~ *‾
その上で ~/.subversion/config を UTF-8 で保存しておく必要があります。
(1/22 追記)
ソースを眺めたところ、 LANG=ja_JP.SJIS の場合、nl_langinfo(CODESET) が "SJIS" を返します。したがって、apr/misc/unic/charset.c の apr_os_locale_encoding() も "SJIS" を返します。
その文字列がめぐりめぐって apr_util/xlate/xlate.c の apr_xlate_open() へ渡り、その中の iconv_open() へ渡ります。
iconv は SJIS だけではなく CP932 もサポートしていますから、nl_langinfo(CODESET) が "CP932" を返すように、LANG=ja_JP.CP932 に設定するのがもっとも正しい解決だと言えます。
しかし cygwin 1.7.1 では SJIS と CP932 を同一視しており、ja_JP.CP932 に設定することができません。
- なお、LANG=ja_JP.UTF-8 で使用している時は問題なく使用可能です。
- また、LANG=ja_JP.SJIS 環境では、~ を含むファイル名のファイルを commit すると、ファイル名が ‾ として commit されてしまうことになると思われるので注意する必要があります。他にもこのような問題が起こる文字はありそうです。
- 従来の文字コードとUnicodeの対応に関する諸問題
nt emacs23.1
Windows 環境では今までずっと Meadow のお世話になってきていたのですが、最近素の ntemacs を使うことに変更しました http://ftp.gnu.org/pub/gnu/emacs/windows/。*1
相変わらず日本語に関してはデフォルトではいまいちな emacs なので、多少設定する必要があります。
http://nijino.homelinux.net/emacs/emacs23-ja.html が大変参考になりました。
また、デフォルトのフォントを MS Gothic にしたかったのでこんな感じで。
(cond (window-system ;; フォント設定 (set-face-attribute 'default nil :family "MS Gothic" :height 100) (setq w32-enable-synthesized-fonts t) ;; 初期フレームの設定 (setq initial-frame-alist (append (list '(foreground-color . "white") '(background-color . "gray20") '(border-color . "gray20") '(mouse-color . "white") '(cursor-color . "white") '(font . "MS Gothic") '(line-spacing . 1) '(width . 80) '(height . 45) ;'(alpha 80 80) '(top . 100) '(left . 100) ) initial-frame-alist)) (setq default-frame-alist initial-frame-alist) (global-set-key [(meta kanji)] 'ignore) (global-set-key [(non-convert)] 'ignore) ))