root/lang/csharp/Criw-0/Converter.cs

Revision 1736, 7.7 kB (checked in by mayuki, 14 months ago)

lang/csharp: WZERO3などで動くIRCクライアントのサンプル実装 Criw-0 を追加。

  • Property svn:keywords set to Id
Line 
1// $Id$
2using System;
3using System.Text;
4using System.Text.RegularExpressions;
5using System.Collections;
6
7namespace Circuit.Text.JapaneseStringUtilities
8{
9        public class Converter
10        {
11                private static readonly Hashtable _tableZenkakuToHankaku;
12                private static readonly Char[] _tableHankakuToZenkakuHanDakuten;
13                private static readonly Char[] _tableHankakuToZenkaku;
14                private static readonly Char[,] _tableHankakuToZenkakuDakuten;
15
16                private Converter() { }
17               
18                static Converter()
19                {
20                        _tableZenkakuToHankaku = new Hashtable();
21                        _tableZenkakuToHankaku['�B'] = "�";
22                        _tableZenkakuToHankaku['�u'] = "�";
23                        _tableZenkakuToHankaku['�v'] = "�";
24                        _tableZenkakuToHankaku['�A'] = "�";
25                        _tableZenkakuToHankaku['�E'] = "�";
26                        _tableZenkakuToHankaku['��'] = "�";
27                        _tableZenkakuToHankaku['�@'] = "�";
28                        _tableZenkakuToHankaku['�B'] = "�";
29                        _tableZenkakuToHankaku['�D'] = "�";
30                        _tableZenkakuToHankaku['�F'] = "�";
31                        _tableZenkakuToHankaku['�H'] = "�";
32                        _tableZenkakuToHankaku['��'] = "�";
33                        _tableZenkakuToHankaku['��'] = "�";
34                        _tableZenkakuToHankaku['��'] = "�";
35                        _tableZenkakuToHankaku['�b'] = "�";
36                        _tableZenkakuToHankaku['�['] = "�";
37                        _tableZenkakuToHankaku['�A'] = "�";
38                        _tableZenkakuToHankaku['�C'] = "�";
39                        _tableZenkakuToHankaku['�E'] = "�";
40                        _tableZenkakuToHankaku['�G'] = "�";
41                        _tableZenkakuToHankaku['�I'] = "�";
42                        _tableZenkakuToHankaku['�J'] = "�";
43                        _tableZenkakuToHankaku['�L'] = "�";
44                        _tableZenkakuToHankaku['�N'] = "�";
45                        _tableZenkakuToHankaku['�P'] = "�";
46                        _tableZenkakuToHankaku['�R'] = "�";
47                        _tableZenkakuToHankaku['�T'] = "�";
48                        _tableZenkakuToHankaku['�V'] = "�";
49                        _tableZenkakuToHankaku['�X'] = "�";
50                        _tableZenkakuToHankaku['�Z'] = "�";
51                        _tableZenkakuToHankaku['�\'] = "�";
52                        _tableZenkakuToHankaku['�^'] = "�;
53                        _tableZenkakuToHankaku['�`'] = "�;
54                        _tableZenkakuToHankaku['�c'] = "�;
55                        _tableZenkakuToHankaku['�e'] = "�;
56                        _tableZenkakuToHankaku['�g'] = "�;
57                        _tableZenkakuToHankaku['�i'] = "�;
58                        _tableZenkakuToHankaku['�j'] = "�;
59                        _tableZenkakuToHankaku['�k'] = "�;
60                        _tableZenkakuToHankaku['�l'] = "�;
61                        _tableZenkakuToHankaku['�m'] = "�;
62                        _tableZenkakuToHankaku['�n'] = "�;
63                        _tableZenkakuToHankaku['�q'] = "�;
64                        _tableZenkakuToHankaku['�t'] = "�;
65                        _tableZenkakuToHankaku['�w'] = "�;
66                        _tableZenkakuToHankaku['�z'] = "�;
67                        _tableZenkakuToHankaku['�}'] = "�;
68                        _tableZenkakuToHankaku['�~'] = "�;
69                        _tableZenkakuToHankaku['��'] = "�;
70                        _tableZenkakuToHankaku['��'] = "�;
71                        _tableZenkakuToHankaku['��'] = "�;
72                        _tableZenkakuToHankaku['��'] = "�;
73                        _tableZenkakuToHankaku['��'] = "�;
74                        _tableZenkakuToHankaku['��'] = "�;
75                        _tableZenkakuToHankaku['��'] = "�;
76                        _tableZenkakuToHankaku['��'] = "�";
77                        _tableZenkakuToHankaku['��'] = "�;
78                        _tableZenkakuToHankaku['��'] = "��;
79                        _tableZenkakuToHankaku['�J'] = "�;
80                        _tableZenkakuToHankaku['�K'] = "�;
81                        _tableZenkakuToHankaku['�K'] = "��;
82                        _tableZenkakuToHankaku['�M'] = "��;
83                        _tableZenkakuToHankaku['�O'] = "��;
84                        _tableZenkakuToHankaku['�Q'] = "��;
85                        _tableZenkakuToHankaku['�S'] = "��;
86                        _tableZenkakuToHankaku['�U'] = "��;
87                        _tableZenkakuToHankaku['�W'] = "��;
88                        _tableZenkakuToHankaku['�Y'] = "��;
89                        _tableZenkakuToHankaku['�['] = "��;
90                        _tableZenkakuToHankaku['�]'] = "��;
91                        _tableZenkakuToHankaku['�_'] = "�";
92                        _tableZenkakuToHankaku['�a'] = "�";
93                        _tableZenkakuToHankaku['�d'] = "�";
94                        _tableZenkakuToHankaku['�f'] = "�";
95                        _tableZenkakuToHankaku['�h'] = "�";
96                        _tableZenkakuToHankaku['�o'] = "�";
97                        _tableZenkakuToHankaku['�r'] = "�";
98                        _tableZenkakuToHankaku['�u'] = "�";
99                        _tableZenkakuToHankaku['�x'] = "�";
100                        _tableZenkakuToHankaku['�{'] = "�";
101                        _tableZenkakuToHankaku['�p'] = "�";
102                        _tableZenkakuToHankaku['�s'] = "�";
103                        _tableZenkakuToHankaku['�v'] = "�";
104                        _tableZenkakuToHankaku['�y'] = "�";
105                        _tableZenkakuToHankaku['�|'] = "�";
106                       
107                        _tableHankakuToZenkaku = new Char[] {
108                                '�B', '�u', '�v', '�A', '�E', '��',
109                                '�@', '�B', '�D', '�F', '�H',
110                                '��', '��', '��', '�b', '�[',
111                                '�A', '�C', '�E', '�G', '�I',
112                                '�J', '�L', '�N', '�P', '�R',
113                                '�T', '�V', '�X', '�Z', '�\',
114                                '�^', '�`', '�c', '�e', '�g',
115                                '�i', '�j', '�k', '�l', '�m',
116                                '�n', '�q', '�t', '�w', '�z',
117                                '�}', '�~', '��', '��', '��',
118                                '��', '��', '��',
119                                '��', '��', '��', '��', '��',
120                                '��', '��',
121                                '�J', '�K',
122                        };
123                        _tableHankakuToZenkakuDakuten = new Char[,] {
124                                {' ', ' ', ' ', ' ', ' '},
125                                {'�K', '�M', '�O', '�Q', '�S'},
126                                {'�U', '�W', '�Y', '�[', '�]'},
127                                {'�_', '�a', '�d', '�f', '�h'},
128                                {' ', ' ', ' ', ' ', ' '},
129                                {'�o', '�r', '�u', '�x', '�{'},
130                        };
131                        _tableHankakuToZenkakuHanDakuten = new Char[] {
132                                '�p', '�s', '�v', '�y', '�|',
133                        };
134                }
135               
136                public static String
137                Convert(String str, ConvertFlags wideFlag, ConvertFlags narrowFlag)
138                {
139                        StringBuilder sb = new StringBuilder();
140                        //Console.WriteLine("Convert In: {0}", str);
141                        for (Int32 i = 0; i < str.Length; i++) {
142                                Char c = str[i];
143                                Boolean isNextDakuten = (str.Length > i+1 ? (str[i+1] == '�) : false);
144                                Boolean isNextHanDakuten = (str.Length > i+1 ? (str[i+1] == '�) : false);
145                                //Console.WriteLine("  - char: {0}", c);
146                                //Console.WriteLine("  - isNextDakuten: {0}", isNextDakuten);
147                                //Console.WriteLine("  - isNextHanDakuten: {0}", isNextHanDakuten);
148                               
149                                if (((narrowFlag & ConvertFlags.Katakana) != 0) && _tableZenkakuToHankaku.ContainsKey(c)) {
150                                        // �S�p�J�i -> ���p�J�i
151                                        sb.Append(_tableZenkakuToHankaku[c]);
152                                } else if (((wideFlag & ConvertFlags.Katakana) != 0) && (c >= '�' && c <= '�)) {
153                                        // ���p�J�i -> �S�p�J�i
154                                        Int32 col = (c - '�') / 5; // �A�J�T�^�i�s
155                                        Int32 row = (c - '�') % 5; // �A�C�E�G�I
156                                        //Console.WriteLine("    - char: {0} at {1} - {2}", c, col, row);
157                                       
158                                        if (isNextDakuten) {
159                                                switch (col) {
160                                                case 1: case 2: case 3: case 5:
161                                                        //Console.WriteLine("      -> {0}", _tableHankakuToZenkakuDakuten[col, row]);
162                                                        sb.Append(_tableHankakuToZenkakuDakuten[col, row]);
163                                                        i++;
164                                                        break;
165                                                default:
166                                                        if (c == '�') {
167                                                                sb.Append('��');
168                                                                i++;
169                                                        }
170                                                        break;
171                                                }
172                                        } else if (isNextHanDakuten && col == 5) {
173                                                sb.Append(_tableHankakuToZenkakuHanDakuten[row]);
174                                                i++;
175                                        } else {
176                                                //Console.WriteLine("      -> {0}", _tableHankakuToZenkaku[(c - '�')]);
177                                                sb.Append(_tableHankakuToZenkaku[(c - '�')]);
178                                        }
179                                } else if (((wideFlag & ConvertFlags.Alphabet) != 0) && (c >= '!' && c <= '~' && (c < '0' || c > '9'))) {
180                                        // ���p�A���t�@�x�b�g -> �S�p�A���t�@�x�b�g
181                                        sb.Append((Char)('�I' + (c - '!')));
182                                } else if (((narrowFlag & ConvertFlags.Alphabet) != 0) && (c >= '�I' && c <= '�`' && (c < '�O' || c > '�X'))) {
183                                        // �S�p�A���t�@�x�b�g -> ���p�A���t�@�x�b�g
184                                        sb.Append((Char)('!' + (c - '�I')));
185                                } else if (((wideFlag & ConvertFlags.Numeric) != 0) && (c >= '0' && c <= '9')) {
186                                        // ���p���� -> �S�p����
187                                        sb.Append((Char)('�O' + (c - '0')));
188                                } else if (((narrowFlag & ConvertFlags.Numeric) != 0) && (c >= '�O' && c <= '�X')) {
189                                        // �S�p���� -> ���p����
190                                        sb.Append((Char)('0' + (c - '�O')));
191                                } else if (((wideFlag & ConvertFlags.Space) != 0) && (c == ' ')) {
192                                        // ���p��-> �S�p��
193                                        sb.Append('�@');
194                                } else if (((narrowFlag & ConvertFlags.Space) != 0) && (c == '�@')) {
195                                        // �S�p��-> ���p��
196                                        sb.Append(' ');
197                                } else {
198                                        sb.Append(c);
199                                }
200                        }
201                        return sb.ToString();
202                }
203        }
204        [Flags]
205        public enum ConvertFlags
206        {
207                None         = 0x0000,
208                Katakana     = 0x0001,
209                Numeric      = 0x0002,
210                Alphabet     = 0x0004,
211                AlphaNumeric = Numeric | Alphabet,
212                Space        = 0x0008,
213                All          = Katakana | AlphaNumeric | Space
214        }
215}
Note: See TracBrowser for help on using the browser.