5 // Created by 西田 耀 on 13/02/10.
\r
6 // Copyright (c) 2013年 Hikaru Nishida. All rights reserved.
\r
9 //UTF-8関連のうち、このソースファイルで完結する関数群
\r
22 int CHNLIB_UTF8_GetCharacterType(char c)
\r
25 //UTF-8文字列中の1バイトcが、UTF-8文字列中でどのような役割を持つのかを返す。
\r
28 //2以上の数値n:nバイト文字の最初のバイト。後続のn個のマルチバイト後続バイトと組み合わせて一つの文字を示す。
\r
30 if(((c >> 6) & 3) == 2){
\r
34 } else if(((c >> 7) & 1) == 0){
\r
39 } else if(((c >> 5) & 7) == 6){
\r
44 } else if(((c >> 4) & 15) == 14){
\r
49 } else if(((c >> 3) & 31) == 30){
\r
59 int CHNLIB_UTF8_GetStringLengthByCharacter(const char s[])
\r
62 //sをUTF-8文字列として解釈し、文字としては何文字で構成された文字列かを返す。
\r
63 //無効な(マルチバイトの一部が欠けているような)文字はカウントしない。
\r
73 for(i = 0; s[i] != '\0'; i++){
\r
74 n = CHNLIB_UTF8_GetCharacterType(s[i]);
\r
105 uint CHNLIB_UTF8_GetNextUnicodeOfCharacter(const char s[], const char **next)
\r
108 //sをUTF-8文字列として解釈し、その文字列の最初の文字のUnicodeを返す。
\r
109 //また、nextがNULLでないとき、*nextに、この文字列中で次の文字にあたる部分へのポインタを格納する。
\r
110 //s==NULLの時、*nextの値は変更されない。
\r
111 //次の文字が存在しない場合は、*nextはs中の終端文字へのポインタとなる。また、戻り値は0となる。
\r
112 //無効な(マルチバイトの一部が欠けているような)文字は無視する。
\r
122 for(i = 0; s[i] != '\0'; i++){
\r
123 n = CHNLIB_UTF8_GetCharacterType(s[i]);
\r
134 unicode |= (0x3f & s[i]);
\r
143 *next = (char *)(s + 1);
\r
148 unicode = (((s[i]) << (n + 1)) >> n + 1);
\r
151 *next = (char *)(s + n);
\r
162 int CHNLIB_UTF8_CompareString(const char s[], const char search[])
\r
165 //s,searchをUTF-8文字列として解釈し、s[]の先頭からsearch[]と比較し、searchの終端まで一致したらTrue, 一致しなかったらFalseを返す。
\r
166 //終端文字は比較せず、search[]に含まれる文字(終端文字除く)がすべて入っていれば一致とみなす。
\r
167 //ただし、searchの先頭文字が終端文字、つまり空文字列だった場合は、常にFalseを返す。
\r
170 if(s == NULL || search == NULL){
\r
171 CHNLIB_ReportError("Null str.\n", CHNLIB_DEBUG_ARGUMENTS);
\r
174 if(search[0] == '\0'){
\r
175 //空文字はいかなる文字列とも一致しない。
\r
179 i_max = CHNLIB_UTF8_GetStringLengthByCharacter(search);
\r
180 for(i = 0; i < i_max; i++){
\r
181 if(CHNLIB_UTF8_GetNextUnicodeOfCharacter(s, &s) != CHNLIB_UTF8_GetNextUnicodeOfCharacter(search, &search)){
\r
188 int CHNLIB_UTF8_CompareString_LeftHand(const char s[], const char search[])
\r
191 //s,searchをUTF-8文字列として解釈し、二つの文字列がどの程度一致するか調べる。前方一致。
\r
192 //戻り値は、終端文字を除く、同一だった文字数。
\r
195 if(s == NULL || search == NULL){
\r
196 CHNLIB_ReportError("Null str.\n", CHNLIB_DEBUG_ARGUMENTS);
\r
200 i_max = CHNLIB_UTF8_GetStringLengthByCharacter(search);
\r
201 for(i = 0; i < i_max; i++){
\r
202 if(CHNLIB_UTF8_GetNextUnicodeOfCharacter(s, &s) != CHNLIB_UTF8_GetNextUnicodeOfCharacter(search, &search)){
\r
209 int CHNLIB_UTF8_GetByteSizeFromLengthByCharacter(const char s[], int start, int end)
\r
212 //sをUTF-8文字列として解釈し、start番目の文字からend番目の文字までの占めるバイト数を返す。
\r
213 //start番目の文字が終端文字以降の文字を指している場合は0を返す。
\r
214 //end番目の文字が終端文字以降の文字を指していても、endが文字列終端を指している場合と同値になる。
\r
219 CHNLIB_ReportError("Null str.\n", CHNLIB_DEBUG_ARGUMENTS);
\r
223 CHNLIB_ReportError("Invalid index.\n", CHNLIB_DEBUG_ARGUMENTS);
\r
227 for(i = 0; i < start; i++){
\r
228 if(CHNLIB_UTF8_GetNextUnicodeOfCharacter(s, &s) == 0){
\r
233 for(; i <= end; i++){
\r
234 CHNLIB_UTF8_GetNextUnicodeOfCharacter(p, &p);
\r
237 return (int)(p - s);
\r
240 uint CHNLIB_UTF8_GetCountOfContain(const char s[], const char search[])
\r
243 //文字列s中に、文字列searchがいくつ含まれているかを返す。
\r
246 if(s == NULL || search == NULL){
\r
247 CHNLIB_ReportError("Null str.\n", CHNLIB_DEBUG_ARGUMENTS);
\r
253 if(CHNLIB_UTF8_CompareString(s, search)){
\r
256 if(CHNLIB_UTF8_GetNextUnicodeOfCharacter(s, &s) == 0){
\r