トップ «前の日記(2024-07-04) 最新 次の日記(2024-07-09)» 編集

Orz日記 by Akio Morita

ToDo:

  • 15 SAD Fit[]回りの障害事例の解析
  • 10 smart pointer版PEGクラスの再実装(Left Recursionまわり)
2006|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|06|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|07|08|09|10|11|12|
2013|01|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|06|07|08|10|12|
2016|01|02|03|05|06|08|10|11|
2017|01|02|03|04|05|06|07|09|10|11|12|
2018|01|02|03|04|06|07|08|09|10|11|12|
2019|01|03|04|05|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|

2024-07-04 [長年日記]

_ [FreeBSD]ja_JP.eucJP→ja_JP.UTF-8への移行

XIM入力を含めFreeBSD+X.org環境の不具合は概ね原因特定・パッチ完了〜

残る問題は、

  • xterm等で使用しているiso10646 fontのグリフ足りない問題
    • 「☆」とかが手元のiso10646 font + xtermだと豆腐になる
    • 当面ktermの運用で回避しつつ、グリフがフル実装されたUnicode fontを探す?
  • Sambaやmsdosfsを介したWindows環境との運用互換性問題
    • 運用上のUnicode符号位置の非互換性をカバーするエンコードをlibiconv等へ実装することを検討中
      • 名前どうしよう?MicrosoftのUnicode符号位置に対応したEUC-JPの変種にEUC-JP-MSと命名されていたのに習うとUTF-8-MSとかになるのだが、UTF-8の変種間の変換なので意味づけがややこしい

あと、ports運用上ストレスになる問題

  • kterm + portconfigで罫線込みのダイアログの版組が崩れる
    • xterm + portconfigは問題無し
    • 罫線文字の幅が、xtermでは半角扱い・ktermでは全角扱いなのが原因の模様
      • kterm的にはJISX0208経由で扱われるため全角になるのは理解出来る
      • Unicode規格的には、FULLWIDTHと書いてないので、英数字と同じ半角グリフデザインもJISX0208的な全角グリフデザインも包摂基準内
        • CUIコンソール上での版組使用を考えなかったんかい!(Unicode的には規格の領域外なのだろうが、収録元の用例は通常の文字と一緒に版組的に使っていたはず)
      • libdialog辺りにパッチして、罫線文字の文字幅の概念を持たせるぐらいしか解決策が無いか?

_ [FreeBSD]iconvのコードセット拡張

  • ports/converters/libiconv
    • UCS-4を中間コードとする変換系
    • utf-8の実装系をベースに改造するのが簡単だった
      • lib/utf8.hを拡張して、UTF8のエンコード・デコード時にUCSコードポイントを変換する亜種を定義する
      • lib/encodings.defにUTF-8の亜種エンコーディングを登録する
      • Makefile.develを使って lib/*.hを更新する
        • このプロセスは、pre-configureターゲット辺りに突っ込めばよい
        • Makefile.develがGNU makeとgperfを要求するので、依存関係を突っ込んでおく
  • Citrus iconv(libc同梱の実装系)
    • CSI独立な実装
    • UTF8 encodingの亜種を作る方が簡単だった
      • lib/libiconv_modules/UTF8/citrus_utf8.c改造
        • UTF1632の実装を参考に、_UTF8EncodingInfo型にモードフラグ実装
        • UTF1632の実装を参考に、_citrus_UTF8_encoding_module_initVARIABLEデコードと_UTF8EncodingInfoのモードフラグ初期化を実装
        • Microsoft側とUnix側で入れ替えたいコードポイントを変換するヘルパー関数を実装
        • _citrus_UTF8_wcrtomb_priv先頭に、モードフラグ依存でwcを変換するコードを追加
        • _citrus_UTF8_mbrtowc_privwcharを書き戻す直前に、モードフラグ依存でwcharを変換するコードを追加
      • share/i18n/esdb/UTF改造
        • Makefile内のUTF-8エントリを複製し、先ほど定義したモードフラグ付きのUTF-8の変種を設定
        • UTF.partに、定義したUTF-8の変種を登録
      • CSIDの定義はUCSのまま、multibyte stringへの符号化方式の亜種として定義した
      • EUCJP-MSの定義等と比べて、符号位置の変更をmultibyte encoding側で施すのは邪道だが…
        • CSIDを独立に定義しても、UTF-8系の運用しか想定してないので、独立定義するメリットが薄い
        • 数文字の符号位置変更以外ほぼ恒等写像なUCS全体をカバーする変換マップの格納効率が悪すぎる
--- lib/libiconv_modules/UTF8/citrus_utf8.c.orig
+++ lib/libiconv_modules/UTF8/citrus_utf8.c
@@ -116,7 +116,9 @@ typedef struct {
       char     ch[6];
 } _UTF8State;

-typedef void *_UTF8EncodingInfo;
+typedef struct {
+      bool     ms;
+} _UTF8EncodingInfo;

 #define _CEI_TO_EI(_cei_)             (&(_cei_)->ei)
 #define _CEI_TO_STATE(_ei_, _func_)   (_ei_)->states.s_##_func_
@@ -149,6 +151,35 @@ _UTF8_surrogate(wchar_t wc)
       return (wc >= 0xd800 && wc <= 0xdfff);
 }

+static __inline wchar_t
+_UTF8_ms_map(wchar_t wc, bool to_utf8_ms)
+{
+      switch(wc) {
+      case 0x301c: return to_utf8_ms ? 0xff5e : wc;
+      case 0xff5e: return to_utf8_ms ? wc : 0x301c;
+
+      case 0x2016: return to_utf8_ms ? 0x2225 : wc;
+      case 0x2225: return to_utf8_ms ? wc : 0x2016;
+
+      case 0x2212: return to_utf8_ms ? 0xff0d : wc;
+      case 0xff0d: return to_utf8_ms ? wc : 0x2212;
+
+      case 0x00a2: return to_utf8_ms ? 0xffe0 : wc;
+      case 0xffe0: return to_utf8_ms ? wc : 0x00a2;
+
+      case 0x00a3: return to_utf8_ms ? 0xffe1 : wc;
+      case 0xffe1: return to_utf8_ms ? wc : 0x00a3;
+
+      case 0x00ac: return to_utf8_ms ? 0xffe2 : wc;
+      case 0xffe2: return to_utf8_ms ? wc : 0x00ac;
+
+      case 0x2014: return to_utf8_ms ? 0x2015 : wc;
+      case 0x2015: return to_utf8_ms ? wc : 0x2014;
+
+      default:     return wc;
+      }
+}
+
 static __inline void
 /*ARGSUSED*/
 _citrus_UTF8_init_state(_UTF8EncodingInfo *ei __unused, _UTF8State *s)
@@ -223,6 +254,9 @@ _citrus_UTF8_mbrtowc_priv(_UTF8EncodingInfo *ei, wchar_t *pwc, char **s,
               if (_UTF8_surrogate(wchar) || _UTF8_findlen(wchar) != c)
                       goto ilseq;
       }
+      if(ei->ms) {
+              wchar = _UTF8_ms_map(wchar, true);
+      }
       if (pwc != NULL)
               *pwc = wchar;
       *nresult = (wchar == 0) ? 0 : s0 - *s;
@@ -242,13 +276,16 @@ _citrus_UTF8_mbrtowc_priv(_UTF8EncodingInfo *ei, wchar_t *pwc, char **s,
 }

 static int
-_citrus_UTF8_wcrtomb_priv(_UTF8EncodingInfo *ei __unused, char *s, size_t n,
+_citrus_UTF8_wcrtomb_priv(_UTF8EncodingInfo *ei, char *s, size_t n,
     wchar_t wc, _UTF8State *psenc __unused, size_t *nresult)
 {
       wchar_t c;
       size_t cnt;
       int i, ret;

+      if(ei->ms) {
+              wc = _UTF8_ms_map(wc, false);
+      }
       if (_UTF8_surrogate(wc)) {
               ret = EILSEQ;
               goto err;
@@ -326,12 +363,35 @@ _citrus_UTF8_stdenc_get_state_desc_generic(_UTF8EncodingInfo * __restrict ei __u
       return (0);
 }

+static void
+parse_variable(_UTF8EncodingInfo * __restrict ei,
+    const void * __restrict var, size_t lenvar)
+{
+      const char *p;
+
+      p = var;
+      while (lenvar > 0) {
+              switch (*p) {
+              case 'M':
+              case 'm':
+                      MATCH(ms, ei->ms = true);
+                      break;
+              }
+              p++;
+              lenvar--;
+      }
+}
+
 static int
 /*ARGSUSED*/
-_citrus_UTF8_encoding_module_init(_UTF8EncodingInfo * __restrict ei __unused,
+_citrus_UTF8_encoding_module_init(_UTF8EncodingInfo * __restrict ei,
     const void * __restrict var __unused, size_t lenvar __unused)
 {

+      memset((void *)ei, 0, sizeof(*ei));
+
+      parse_variable(ei, var, lenvar);
+
       return (0);
 }

--- share/i18n/esdb/UTF/Makefile.orig
+++ share/i18n/esdb/UTF/Makefile
@@ -25,6 +25,8 @@ UTF-32-SWAPPED-mod= UTF1632
 UTF-32-SWAPPED-var= utf32,swapped,force
 UTF-8-mod= UTF8
 UTF-8-var= utf8
+UTF-8-MS-mod= UTF8
+UTF-8-MS-var= utf8,ms
 UTF-7-mod= UTF7
 UTF-7-var= utf7

--- share/i18n/esdb/UTF/UTF.part.orig
+++ share/i18n/esdb/UTF/UTF.part
@@ -2,6 +2,7 @@

 7
 8
+8-MS
 16
 16BE
 16LE

一応、Windows側のUnicode符号位置の利用状況を許容して、FreeBSD側でEUC-JP互換なUnicode符号位置でSambaを運用する準備が出来たはず…


カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記