Блин запарился. Неужели нет функции конвертации строки из unicode в разные кодовые страницы?
Сейчас как м#дак пишу кучу функций:
function UnicodeToWin874(ch: Word): Word;
function UnicodeToWin932(ch: Word): Word;
function UnicodeToWin936(ch: Word): Word;
function UnicodeToWin949(ch: Word): Word;
function UnicodeToWin950(ch: Word): Word;
function UnicodeToWin1250(ch: Word): Word;
function UnicodeToWin1251(ch: Word): Word;
function UnicodeToWin1252(ch: Word): Word;
function UnicodeToWin1253(ch: Word): Word;
function UnicodeToWin1254(ch: Word): Word;
function UnicodeToWin1255(ch: Word): Word;
function UnicodeToWin1256(ch: Word): Word;
function UnicodeToWin1257(ch: Word): Word;
…
И в каждой из них перебираю все символы. Запарило уже (особенно для всяких китайцев и корейцев)…
Самое обидное, что умом понимаю – делаю фигню и такие функции есть где-то в Windows (по крайней мере в NT/2000/XP), но найти нифига не могу:-(
А без таких конвертеров мой MS Word Document reader не работает:-)
Даже нашел список Ranges для языков, но не понимаю как их перевести в кодовые страницы…
ftp://ftp.unicode.org/Public/UNIDATA/Blocks.txt
0000; 007F; Basic Latin
0080; 00FF; Latin-1 Supplement
0100; 017F; Latin Extended-A
0180; 024F; Latin Extended-B
0250; 02AF; IPA Extensions
02B0; 02FF; Spacing Modifier Letters
0300; 036F; Combining Diacritical Marks
0370; 03FF; Greek
0400; 04FF; Cyrillic
0530; 058F; Armenian
0590; 05FF; Hebrew
0600; 06FF; Arabic
0700; 074F; Syriac
0780; 07BF; Thaana
0900; 097F; Devanagari
0980; 09FF; Bengali
0A00; 0A7F; Gurmukhi
0A80; 0AFF; Gujarati
0B00; 0B7F; Oriya
0B80; 0BFF; Tamil
0C00; 0C7F; Telugu
0C80; 0CFF; Kannada
0D00; 0D7F; Malayalam
0D80; 0DFF; Sinhala
0E00; 0E7F; Thai
0E80; 0EFF; Lao
0F00; 0FFF; Tibetan
1000; 109F; Myanmar
10A0; 10FF; Georgian
1100; 11FF; Hangul Jamo
1200; 137F; Ethiopic
13A0; 13FF; Cherokee
1400; 167F; Unified Canadian Aboriginal Syllabics
1680; 169F; Ogham
16A0; 16FF; Runic
1780; 17FF; Khmer
1800; 18AF; Mongolian
1E00; 1EFF; Latin Extended Additional
1F00; 1FFF; Greek Extended
2000; 206F; General Punctuation
2070; 209F; Superscripts and Subscripts
20A0; 20CF; Currency Symbols
20D0; 20FF; Combining Marks for Symbols
2100; 214F; Letterlike Symbols
2150; 218F; Number Forms
2190; 21FF; Arrows
2200; 22FF; Mathematical Operators
2300; 23FF; Miscellaneous Technical
2400; 243F; Control Pictures
2440; 245F; Optical Character Recognition
2460; 24FF; Enclosed Alphanumerics
2500; 257F; Box Drawing
2580; 259F; Block Elements
25A0; 25FF; Geometric Shapes
2600; 26FF; Miscellaneous Symbols
2700; 27BF; Dingbats
2800; 28FF; Braille Patterns
2E80; 2EFF; CJK Radicals Supplement
2F00; 2FDF; Kangxi Radicals
2FF0; 2FFF; Ideographic Description Characters
3000; 303F; CJK Symbols and Punctuation
3040; 309F; Hiragana
30A0; 30FF; Katakana
3100; 312F; Bopomofo
3130; 318F; Hangul Compatibility Jamo
3190; 319F; Kanbun
31A0; 31BF; Bopomofo Extended
3200; 32FF; Enclosed CJK Letters and Months
3300; 33FF; CJK Compatibility
3400; 4DB5; CJK Unified Ideographs Extension A
4E00; 9FFF; CJK Unified Ideographs
A000; A48F; Yi Syllables
A490; A4CF; Yi Radicals
AC00; D7A3; Hangul Syllables
D800; DB7F; High Surrogates
DB80; DBFF; High Private Use Surrogates
DC00; DFFF; Low Surrogates
E000; F8FF; Private Use
F900; FAFF; CJK Compatibility Ideographs
FB00; FB4F; Alphabetic Presentation Forms
FB50; FDFF; Arabic Presentation Forms-A
FE20; FE2F; Combining Half Marks
FE30; FE4F; CJK Compatibility Forms
FE50; FE6F; Small Form Variants
FE70; FEFE; Arabic Presentation Forms-B
FEFF; FEFF; Specials
FF00; FFEF; Halfwidth and Fullwidth Forms
FFF0; FFFD; Specials
Зато нашел полезную фичу – конвертацию из локали в codepage:
GetLocaleInfo(LanguageID, LOCALE_IDEFAULTANSICODEPAGE, Buf, 6);
Result := StrToIntDef(Buf, GetACP());
Например, для $404, $C04 – вернет 950 (BIG5, Traditional Chinese), а для $804 – 936 (GBK, Simplified Chinese)
При этом всякие cyrrilic (Bulgarian, Albanian, Russian, Ukrainian, Belarusian, Serbian, Azeri, Uzbek etc) правильно возвращают 1251