Develop and Download Open Source Software

Recent Changes

2012-05-23
2011-10-25
2011-03-03
2010-06-20
2010-03-23
2010-03-14

Wiki Guide

Side Bar

UNICODE化と呼んでいいか解らないけど、なにをどうすればできるのかも解らないのでまとめてみるページ



  • どこを修正して、どこを修正しなくていいのか調べる
  • MBCS 用のコードを排除
  • #define UNICODE することで動かなくなる(ANSI API でないといけない)ところを修正する
  • ttl の UNICODE? UTF8? 対応
  • 9x/NT4 用に MBCS 版を残す?
    • UNICODE のターゲットを追加して、#ifdef UNICODE で切り分けて MBCS のバイナリも吐けるようにソースを書く?
    • バイナリはインストーラで切り替え?
  • ソースコードの管理をどうするか。
    • ブランチを切り、2本立てとする。
    • ソースコードの一本化

開発方針

  • Microsoftの方針に従うと、TCHAR化が必要だが、今から全ソースコードを書き換えるのは現実的ではない。
  • まずは、ターミナルバッファのみのTCHAR化を考える。
    • リモートホストからの受信(UTF8) -> Unicode(UTF16LE)へ変換 -> バッファ格納 -> Unicodeとして表示
    • クライアントからのキー入力 -> UTF8へ変換 -> リモートホストへ送信
    • クライアントからのIME入力 -> UTF8へ変換 -> リモートホストへ送信

他アプリでの実装

  • PuTTYでは、直接 wchar_t や ワイド関数を使っている。
  • サクラエディタでは、条件文(#ifdef _UNICODE)で処理を分けている。
    • ソースコードが一本化できるが、煩雑な作りとなる。
  • RLoginでは、文字コード変換はICONV任せ。

コーディングメモ

  • WinMain() -> _tWinMain() に置換する。
  • char -> TCHAR に置換する。
  • LPSTR -> LPTSTR, LPCSTR -> LPCTSTR に置換する。
  • 文字列リテラルには、すべて TEXT or _T マクロで囲む。
    • "foo" -> TEXT("foo")
    • "foo" -> _T("foo")
  • 文字列操作関数も TCHAR 版を使う。
    • strcpy() -> _tcscpy()
  • IME入力
    • ImmGetCompositionStringW()を直接使ってワイドキャラクタで受け取り、UTF-16LE -> UTF8へ変換し、そのまま端末へ送信する。

関連チケット


SourceForge.JP is a Japanese version of SourceForge.net. For developments that are not related to Japan, we recommend you to use SourceForge.net.