cp866<>utf8

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

cp866<>utf8

Сообщение ViruZ » 17.01.2008 15:50:28

Суть проблемы: есть БД (набор dbf программы под ДОС, написанной на FoxPro 2.0) в кодовой странице 866. Требуется открыть некоторые файлы под Линухом (у меня Mandriva 2007.1 Spring, locale UTF-8) и внести небольшие изменения (напр. изменить фамилию сотрудницы, к-я вышла замуж). Конвертация в ср1251 или koi8-r труда не составляет, но необходимо работать именно под Линуксом (очень неохота каждый раз перегружать комп). Работать под эмулятором отпадает - оригинальная программа вылетает в трубу с потерей измененных данных (пробовал DosBox).
ViruZ
постоялец
 
Сообщения: 170
Зарегистрирован: 30.05.2005 17:41:12
Откуда: Украина

Сообщение Attid » 17.01.2008 16:44:11

в чем вопрос ?
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2583
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение ViruZ » 17.01.2008 18:11:33

При попытке конвертировать из ДОС-кодировки в юникод (также пробовал в ср1251 и кои - безрезультатно) в результате под Линухом получаю кракозябрики :( Возможно, что-то делаю не так? Модуль для конвертации собственной разработки:
Код: Выделить всё
unit CpConv;

interface

//uses ;

//const

type TCodePage   = (cp1251,cp866,koi8r,koi8u);
     TCodeTable  = array [0..255] of char;
     TUCodeTable = array [0..511] of char;
     //TUCodeTable = WideString ;

const conv1251_to_866 : TCodeTable =
       #$00#$01#$02#$03#$04#$05#$06#$07#$08#$09#$0A#$0B#$0C#$0D#$0E#$0F +
       #$10#$11#$12#$13#$14#$15#$16#$17#$18#$19#$1A#$1B#$1C#$1D#$1E#$1F +
       #$20#$21#$22#$23#$24#$25#$26#$27#$28#$29#$2A#$2B#$2C#$2D#$2E#$2F +
       #$30#$31#$32#$33#$34#$35#$36#$37#$38#$39#$3A#$3B#$3C#$3D#$3E#$3F +
       #$40#$41#$42#$43#$44#$45#$46#$47#$48#$49#$4A#$4B#$4C#$4D#$4E#$4F +
       #$50#$51#$52#$53#$54#$55#$56#$57#$58#$59#$5A#$5B#$5C#$5D#$5E#$5F +
       #$60#$61#$62#$63#$64#$65#$66#$67#$68#$69#$6A#$6B#$6C#$6D#$6E#$6F +
       #$70#$71#$72#$73#$74#$75#$76#$77#$78#$79#$7A#$7B#$7C#$7D#$7E#$7F +
       #$80#$81#$82#$83#$84#$85#$86#$87#$88#$89#$8A#$8B#$8C#$8D#$8E#$8F +
       #$90#$91#$92#$93#$94#$95#$96#$97#$98#$99#$9A#$9B#$9C#$9D#$9E#$9F +
       #$FF#$F6#$F7#$A3#$FD#$A5#$A6#$A7#$F0#$A9#$F2#$AB#$AC#$AD#$AE#$F4 +
       #$F8#$B1#$B2#$B3#$B4#$B5#$B6#$FA#$F1#$FC#$F3#$BB#$BC#$BD#$BE#$F5 +
       #$80#$81#$82#$83#$84#$85#$86#$87#$88#$89#$8A#$8B#$8C#$8D#$8E#$8F +
       #$90#$91#$92#$93#$94#$95#$96#$97#$98#$99#$9A#$9B#$9C#$9D#$9E#$9F +
       #$A0#$A1#$A2#$A3#$A4#$A5#$A6#$A7#$A8#$A9#$AA#$AB#$AC#$AD#$AE#$AF +
       #$E0#$E1#$E2#$E3#$E4#$E5#$E6#$E7#$E8#$E9#$EA#$EB#$EC#$ED#$EE#$EF ;
       conv1251_to_koi8r : TCodeTable =
       #$00#$01#$02#$03#$04#$05#$06#$07#$08#$09#$0A#$0B#$0C#$0D#$0E#$0F +
       #$10#$11#$12#$13#$14#$15#$16#$17#$18#$19#$1A#$1B#$1C#$1D#$1E#$1F +
       #$20#$21#$22#$23#$24#$25#$26#$27#$28#$29#$2A#$2B#$2C#$2D#$2E#$2F +
       #$30#$31#$32#$33#$34#$35#$36#$37#$38#$39#$3A#$3B#$3C#$3D#$3E#$3F +
       #$40#$41#$42#$43#$44#$45#$46#$47#$48#$49#$4A#$4B#$4C#$4D#$4E#$4F +
       #$50#$51#$52#$53#$54#$55#$56#$57#$58#$59#$5A#$5B#$5C#$5D#$5E#$5F +
       #$60#$61#$62#$63#$64#$65#$66#$67#$68#$69#$6A#$6B#$6C#$6D#$6E#$6F +
       #$70#$71#$72#$73#$74#$75#$76#$77#$78#$79#$7A#$7B#$7C#$7D#$7E#$7F +
       #$80#$81#$82#$83#$84#$85#$86#$87#$88#$89#$8A#$8B#$8C#$8D#$8E#$8F +
       #$90#$91#$92#$93#$94#$95#$96#$97#$98#$99#$9A#$9B#$9C#$9D#$9E#$9F +
       #$9A#$A1#$A2#$A3#$A4#$A5#$A6#$A7#$B3#$BF#$AA#$AB#$AC#$AD#$AE#$AF +
       #$9C#$B1#$B2#$B3#$B4#$B5#$B6#$9E#$A3#$B9#$BA#$BB#$BC#$BD#$BE#$BF +
       #$E1#$E2#$F7#$E7#$E4#$E5#$F6#$FA#$E9#$EA#$EB#$EC#$ED#$EE#$EF#$F0 +
       #$F2#$F3#$F4#$F5#$E6#$E8#$E3#$FE#$FB#$FD#$FF#$F9#$F8#$FC#$E0#$F1 +
       #$C1#$C2#$D7#$C7#$C4#$C5#$D6#$DA#$C9#$CA#$CB#$CC#$CD#$CE#$CF#$D0 +
       #$D2#$D3#$D4#$D5#$C6#$C8#$C3#$DE#$DB#$DD#$DF#$D9#$D8#$DC#$C0#$D1 ;
       conv1251_to_koi8u : TCodeTable =
       #$00#$01#$02#$03#$04#$05#$06#$07#$08#$09#$0A#$0B#$0C#$0D#$0E#$0F +
       #$10#$11#$12#$13#$14#$15#$16#$17#$18#$19#$1A#$1B#$1C#$1D#$1E#$1F +
       #$20#$21#$22#$23#$24#$25#$26#$27#$28#$29#$2A#$2B#$2C#$2D#$2E#$2F +
       #$30#$31#$32#$33#$34#$35#$36#$37#$38#$39#$3A#$3B#$3C#$3D#$3E#$3F +
       #$40#$41#$42#$43#$44#$45#$46#$47#$48#$49#$4A#$4B#$4C#$4D#$4E#$4F +
       #$50#$51#$52#$53#$54#$55#$56#$57#$58#$59#$5A#$5B#$5C#$5D#$5E#$5F +
       #$60#$61#$62#$63#$64#$65#$66#$67#$68#$69#$6A#$6B#$6C#$6D#$6E#$6F +
       #$70#$71#$72#$73#$74#$75#$76#$77#$78#$79#$7A#$7B#$7C#$7D#$7E#$7F +
       #$80#$B4#$82#$83#$84#$85#$86#$87#$88#$89#$8A#$8B#$8C#$8D#$8E#$8F +
       #$90#$91#$92#$93#$94#$95#$96#$97#$98#$99#$9A#$9B#$9C#$9D#$9E#$9F +
       #$9A#$A1#$A2#$A3#$A4#$BD#$A6#$A7#$B3#$BF#$B4#$AB#$AC#$AD#$AE#$B7 +
       #$9C#$B1#$B6#$A6#$AD#$B5#$B6#$9E#$A3#$B9#$A4#$BB#$BC#$BD#$BE#$A7 +
       #$E1#$E2#$F7#$E7#$E4#$E5#$F6#$FA#$E9#$EA#$EB#$EC#$ED#$EE#$EF#$F0 +
       #$F2#$F3#$F4#$F5#$E6#$E8#$E3#$FE#$FB#$FD#$FF#$F9#$F8#$FC#$E0#$F1 +
       #$C1#$C2#$D7#$C7#$C4#$C5#$D6#$DA#$C9#$CA#$CB#$CC#$CD#$CE#$CF#$D0 +
       #$D2#$D3#$D4#$D5#$C6#$C8#$C3#$DE#$DB#$DD#$DF#$D9#$D8#$DC#$C0#$D1 ;
       conv866_to_1251 : TCodeTable =
       #$00#$01#$02#$03#$04#$05#$06#$07#$08#$09#$0A#$0B#$0C#$0D#$0E#$0F +
       #$10#$11#$12#$13#$14#$15#$16#$17#$18#$19#$1A#$1B#$1C#$1D#$1E#$1F +
       #$20#$21#$22#$23#$24#$25#$26#$27#$28#$29#$2A#$2B#$2C#$2D#$2E#$2F +
       #$30#$31#$32#$33#$34#$35#$36#$37#$38#$39#$3A#$3B#$3C#$3D#$3E#$3F +
       #$40#$41#$42#$43#$44#$45#$46#$47#$48#$49#$4A#$4B#$4C#$4D#$4E#$4F +
       #$50#$51#$52#$53#$54#$55#$56#$57#$58#$59#$5A#$5B#$5C#$5D#$5E#$5F +
       #$60#$61#$62#$63#$64#$65#$66#$67#$68#$69#$6A#$6B#$6C#$6D#$6E#$6F +
       #$70#$71#$72#$73#$74#$75#$76#$77#$78#$79#$7A#$7B#$7C#$7D#$7E#$7F +
       #$C0#$C1#$C2#$C3#$C4#$C5#$C6#$C7#$C8#$C9#$CA#$CB#$CC#$CD#$CE#$CF +
       #$D0#$D1#$D2#$D3#$D4#$D5#$D6#$D7#$D8#$D9#$DA#$DB#$DC#$DD#$DE#$DF +
       #$E0#$E1#$E2#$E3#$E4#$E5#$E6#$E7#$E8#$E9#$EA#$EB#$EC#$ED#$EE#$EF +
       #$B0#$B1#$B2#$B3#$B4#$B5#$B6#$B7#$B8#$B9#$BA#$BB#$BC#$BD#$BE#$BF +
       #$C0#$C1#$C2#$C3#$C4#$C5#$C6#$C7#$C8#$C9#$CA#$CB#$CC#$CD#$CE#$CF +
       #$D0#$D1#$D2#$D3#$D4#$D5#$D6#$D7#$D8#$D9#$DA#$DB#$DC#$DD#$DE#$DF +
       #$F0#$F1#$F2#$F3#$F4#$F5#$F6#$F7#$F8#$F9#$FA#$FB#$FC#$FD#$FE#$FF +
       #$A8#$B8#$AA#$BA#$AF#$BF#$A1#$A2#$B0#$F9#$B7#$FB#$B9#$A4#$FE#$A0 ;
       conv866_to_koi8r : TCodeTable =
       #$00#$01#$02#$03#$04#$05#$06#$07#$08#$09#$0A#$0B#$0C#$0D#$0E#$0F +
       #$10#$11#$12#$13#$14#$15#$16#$17#$18#$19#$1A#$1B#$1C#$1D#$1E#$1F +
       #$20#$21#$22#$23#$24#$25#$26#$27#$28#$29#$2A#$2B#$2C#$2D#$2E#$2F +
       #$30#$31#$32#$33#$34#$35#$36#$37#$38#$39#$3A#$3B#$3C#$3D#$3E#$3F +
       #$40#$41#$42#$43#$44#$45#$46#$47#$48#$49#$4A#$4B#$4C#$4D#$4E#$4F +
       #$50#$51#$52#$53#$54#$55#$56#$57#$58#$59#$5A#$5B#$5C#$5D#$5E#$5F +
       #$60#$61#$62#$63#$64#$65#$66#$67#$68#$69#$6A#$6B#$6C#$6D#$6E#$6F +
       #$70#$71#$72#$73#$74#$75#$76#$77#$78#$79#$7A#$7B#$7C#$7D#$7E#$7F +
       #$E1#$E2#$F7#$E7#$E4#$E5#$F6#$FA#$E9#$EA#$EB#$EC#$ED#$EE#$EF#$F0 +
       #$F2#$F3#$F4#$F5#$E6#$E8#$E3#$FE#$FB#$FD#$FF#$F9#$F8#$FC#$E0#$F1 +
       #$C1#$C2#$D7#$C7#$C4#$C5#$D6#$DA#$C9#$CA#$CB#$CC#$CD#$CE#$CF#$D0 +
       #$90#$91#$92#$81#$87#$B2#$B4#$A7#$A6#$B5#$A1#$A8#$AE#$AD#$AC#$83 +
       #$84#$89#$88#$86#$80#$8A#$AF#$B0#$AB#$A5#$BB#$B8#$B1#$A0#$BE#$B9 +
       #$BA#$B6#$B7#$AA#$A9#$A2#$A4#$BD#$BC#$85#$82#$8D#$8C#$8E#$8F#$8B +
       #$D2#$D3#$D4#$D5#$C6#$C8#$C3#$DE#$DB#$DD#$DF#$D9#$D8#$DC#$C0#$D1 +
       #$B3#$A3#$F2#$F3#$F4#$F5#$F6#$F7#$9C#$95#$9E#$96#$FC#$FD#$94#$9A ;
       conv866_to_koi8u : TCodeTable =
       #$00#$01#$02#$03#$04#$05#$06#$07#$08#$09#$0A#$0B#$0C#$0D#$0E#$0F +
       #$10#$11#$12#$13#$14#$15#$16#$17#$18#$19#$1A#$1B#$1C#$1D#$1E#$1F +
       #$20#$21#$22#$23#$24#$25#$26#$27#$28#$29#$2A#$2B#$2C#$2D#$2E#$2F +
       #$30#$31#$32#$33#$34#$35#$36#$37#$38#$39#$3A#$3B#$3C#$3D#$3E#$3F +
       #$40#$41#$42#$43#$44#$45#$46#$47#$48#$49#$4A#$4B#$4C#$4D#$4E#$4F +
       #$50#$51#$52#$53#$54#$55#$56#$57#$58#$59#$5A#$5B#$5C#$5D#$5E#$5F +
       #$60#$61#$62#$63#$64#$65#$66#$67#$68#$69#$6A#$6B#$6C#$6D#$6E#$6F +
       #$70#$71#$72#$73#$74#$75#$76#$77#$78#$79#$7A#$7B#$7C#$7D#$7E#$7F +
       #$E1#$E2#$F7#$E7#$E4#$E5#$F6#$FA#$E9#$EA#$EB#$EC#$ED#$EE#$EF#$F0 +
       #$F2#$F3#$F4#$F5#$E6#$E8#$E3#$FE#$FB#$FD#$FF#$F9#$F8#$FC#$E0#$F1 +
       #$C1#$C2#$D7#$C7#$C4#$C5#$D6#$DA#$C9#$CA#$CB#$CC#$CD#$CE#$CF#$D0 +
       #$90#$91#$92#$81#$87#$B2#$B6#$B7#$B8#$B5#$A1#$A8#$AE#$BD#$AC#$83 +
       #$84#$89#$88#$86#$80#$8A#$AF#$B0#$AB#$A5#$BB#$B8#$B1#$A0#$BE#$B9 +
       #$BA#$D1#$D2#$AA#$A9#$A2#$D6#$D7#$BC#$85#$82#$8D#$8C#$8E#$8F#$8B +
       #$D2#$D3#$D4#$D5#$C6#$C8#$C3#$DE#$DB#$DD#$DF#$D9#$D8#$DC#$C0#$D1 +
       #$B3#$A3#$F2#$A4#$B7#$A7#$F6#$F7#$9C#$95#$9E#$96#$FC#$FD#$94#$9A ;
       convkoi8r_to_1251 : TCodeTable =
       #$00#$01#$02#$03#$04#$05#$06#$07#$08#$09#$0A#$0B#$0C#$0D#$0E#$0F +
       #$10#$11#$12#$13#$14#$15#$16#$17#$18#$19#$1A#$1B#$1C#$1D#$1E#$1F +
       #$20#$21#$22#$23#$24#$25#$26#$27#$28#$29#$2A#$2B#$2C#$2D#$2E#$2F +
       #$30#$31#$32#$33#$34#$35#$36#$37#$38#$39#$3A#$3B#$3C#$3D#$3E#$3F +
       #$40#$41#$42#$43#$44#$45#$46#$47#$48#$49#$4A#$4B#$4C#$4D#$4E#$4F +
       #$50#$51#$52#$53#$54#$55#$56#$57#$58#$59#$5A#$5B#$5C#$5D#$5E#$5F +
       #$60#$61#$62#$63#$64#$65#$66#$67#$68#$69#$6A#$6B#$6C#$6D#$6E#$6F +
       #$70#$71#$72#$73#$74#$75#$76#$77#$78#$79#$7A#$7B#$7C#$7D#$7E#$7F +
       #$80#$81#$82#$83#$84#$85#$86#$87#$88#$89#$8A#$8B#$8C#$8D#$8E#$8F +
       #$90#$91#$92#$93#$94#$95#$96#$97#$98#$99#$A0#$9B#$B0#$9D#$B7#$9F +
       #$A0#$A1#$A2#$B8#$A4#$A5#$A6#$A7#$A8#$A9#$AA#$AB#$AC#$AD#$AE#$AF +
       #$B0#$B1#$B2#$A8#$B4#$B5#$B6#$B7#$B8#$B9#$BA#$BB#$BC#$BD#$BE#$A9 +
       #$FE#$E0#$E1#$F6#$E4#$E5#$F4#$E3#$F5#$E8#$E9#$EA#$EB#$EC#$ED#$EE +
       #$EF#$FF#$F0#$F1#$F2#$F3#$E6#$E2#$FC#$FB#$E7#$F8#$FD#$F9#$F7#$FA +
       #$DE#$C0#$C1#$D6#$C4#$C5#$D4#$C3#$D5#$C8#$C9#$CA#$CB#$CC#$CD#$CE +
       #$CF#$DF#$D0#$D1#$D2#$D3#$C6#$C2#$DC#$DB#$C7#$D8#$DD#$D9#$D7#$DA ;
       convkoi8r_to_866 : TCodeTable =
       #$00#$01#$02#$03#$04#$05#$06#$07#$08#$09#$0A#$0B#$0C#$0D#$0E#$0F +
       #$10#$11#$12#$13#$14#$15#$16#$17#$18#$19#$1A#$1B#$1C#$1D#$1E#$1F +
       #$20#$21#$22#$23#$24#$25#$26#$27#$28#$29#$2A#$2B#$2C#$2D#$2E#$2F +
       #$30#$31#$32#$33#$34#$35#$36#$37#$38#$39#$3A#$3B#$3C#$3D#$3E#$3F +
       #$40#$41#$42#$43#$44#$45#$46#$47#$48#$49#$4A#$4B#$4C#$4D#$4E#$4F +
       #$50#$51#$52#$53#$54#$55#$56#$57#$58#$59#$5A#$5B#$5C#$5D#$5E#$5F +
       #$60#$61#$62#$63#$64#$65#$66#$67#$68#$69#$6A#$6B#$6C#$6D#$6E#$6F +
       #$70#$71#$72#$73#$74#$75#$76#$77#$78#$79#$7A#$7B#$7C#$7D#$7E#$7F +
       #$C4#$B3#$DA#$BF#$C0#$D9#$C3#$B4#$C2#$C1#$C5#$DF#$DC#$DB#$DD#$DE +
       #$B0#$B1#$B2#$93#$FE#$F9#$FB#$97#$98#$99#$FF#$9B#$F8#$9D#$FA#$9F +
       #$CD#$BA#$D5#$F1#$D6#$C9#$B8#$B7#$BB#$D4#$D3#$C8#$BE#$BD#$BC#$C6 +
       #$C7#$CC#$B5#$F0#$B6#$B9#$D1#$D2#$CB#$CF#$D0#$CA#$D8#$D7#$CE#$BF +
       #$EE#$A0#$A1#$E6#$A4#$A5#$E4#$A3#$E5#$A8#$A9#$AA#$AB#$AC#$AD#$AE +
       #$AF#$EF#$E0#$E1#$E2#$E3#$A6#$A2#$EC#$EB#$A7#$E8#$ED#$E9#$E7#$EA +
       #$9E#$80#$81#$96#$84#$85#$94#$83#$95#$88#$89#$8A#$8B#$8C#$8D#$8E +
       #$8F#$9F#$90#$91#$92#$93#$86#$82#$9C#$9B#$87#$98#$9D#$99#$97#$9A ;
       convkoi8r_to_koi8u : TCodeTable =
       #$00#$01#$02#$03#$04#$05#$06#$07#$08#$09#$0A#$0B#$0C#$0D#$0E#$0F +
       #$10#$11#$12#$13#$14#$15#$16#$17#$18#$19#$1A#$1B#$1C#$1D#$1E#$1F +
       #$20#$21#$22#$23#$24#$25#$26#$27#$28#$29#$2A#$2B#$2C#$2D#$2E#$2F +
       #$30#$31#$32#$33#$34#$35#$36#$37#$38#$39#$3A#$3B#$3C#$3D#$3E#$3F +
       #$40#$41#$42#$43#$44#$45#$46#$47#$48#$49#$4A#$4B#$4C#$4D#$4E#$4F +
       #$50#$51#$52#$53#$54#$55#$56#$57#$58#$59#$5A#$5B#$5C#$5D#$5E#$5F +
       #$60#$61#$62#$63#$64#$65#$66#$67#$68#$69#$6A#$6B#$6C#$6D#$6E#$6F +
       #$70#$71#$72#$73#$74#$75#$76#$77#$78#$79#$7A#$7B#$7C#$7D#$7E#$7F +
       #$80#$81#$82#$83#$84#$85#$86#$87#$88#$89#$8A#$8B#$8C#$8D#$8E#$8F +
       #$90#$91#$92#$93#$94#$95#$96#$97#$98#$99#$9A#$9B#$9C#$9D#$9E#$9F +
       #$A0#$A1#$A2#$A3#$A4#$A5#$A6#$A7#$A8#$A9#$AA#$AB#$AC#$AD#$AE#$AF +
       #$B0#$B1#$B2#$B3#$B4#$B5#$B6#$B7#$B8#$B9#$BA#$BB#$BC#$BD#$BE#$BF +
       #$C0#$C1#$C2#$C3#$C4#$C5#$C6#$C7#$C8#$C9#$CA#$CB#$CC#$CD#$CE#$CF +
       #$D0#$D1#$D2#$D3#$D4#$D5#$D6#$D7#$D8#$D9#$DA#$DB#$DC#$DD#$DE#$DF +
       #$E0#$E1#$E2#$E3#$E4#$E5#$E6#$E7#$E8#$E9#$EA#$EB#$EC#$ED#$EE#$EF +
       #$F0#$F1#$F2#$F3#$F4#$F5#$F6#$F7#$F8#$F9#$FA#$FB#$FC#$FD#$FE#$FF ;
       convkoi8u_to_1251 : TCodeTable =
       #$00#$01#$02#$03#$04#$05#$06#$07#$08#$09#$0A#$0B#$0C#$0D#$0E#$0F +
       #$10#$11#$12#$13#$14#$15#$16#$17#$18#$19#$1A#$1B#$1C#$1D#$1E#$1F +
       #$20#$21#$22#$23#$24#$25#$26#$27#$28#$29#$2A#$2B#$2C#$2D#$2E#$2F +
       #$30#$31#$32#$33#$34#$35#$36#$37#$38#$39#$3A#$3B#$3C#$3D#$3E#$3F +
       #$40#$41#$42#$43#$44#$45#$46#$47#$48#$49#$4A#$4B#$4C#$4D#$4E#$4F +
       #$50#$51#$52#$53#$54#$55#$56#$57#$58#$59#$5A#$5B#$5C#$5D#$5E#$5F +
       #$60#$61#$62#$63#$64#$65#$66#$67#$68#$69#$6A#$6B#$6C#$6D#$6E#$6F +
       #$70#$71#$72#$73#$74#$75#$76#$77#$78#$79#$7A#$7B#$7C#$7D#$7E#$7F +
       #$80#$81#$82#$83#$84#$85#$86#$87#$88#$89#$8A#$8B#$8C#$8D#$8E#$8F +
       #$90#$91#$92#$93#$94#$95#$96#$97#$98#$99#$A0#$9B#$B0#$9D#$B7#$9F +
       #$A0#$A1#$A2#$B8#$BA#$A5#$B3#$BF#$A8#$A9#$AA#$AB#$AC#$B4#$AE#$AF +
       #$B0#$B1#$B2#$A8#$81#$B5#$B2#$AF#$B8#$B9#$BA#$BB#$BC#$A5#$BE#$A9 +
       #$FE#$E0#$E1#$F6#$E4#$E5#$F4#$E3#$F5#$E8#$E9#$EA#$EB#$EC#$ED#$EE +
       #$EF#$FF#$F0#$F1#$F2#$F3#$E6#$E2#$FC#$FB#$E7#$F8#$FD#$F9#$F7#$FA +
       #$DE#$C0#$C1#$D6#$C4#$C5#$D4#$C3#$D5#$C8#$C9#$CA#$CB#$CC#$CD#$CE +
       #$CF#$DF#$D0#$D1#$D2#$D3#$C6#$C2#$DC#$DB#$C7#$D8#$DD#$D9#$D7#$DA ;
       convkoi8u_to_866 : TCodeTable =
       #$00#$01#$02#$03#$04#$05#$06#$07#$08#$09#$0A#$0B#$0C#$0D#$0E#$0F +
       #$10#$11#$12#$13#$14#$15#$16#$17#$18#$19#$1A#$1B#$1C#$1D#$1E#$1F +
       #$20#$21#$22#$23#$24#$25#$26#$27#$28#$29#$2A#$2B#$2C#$2D#$2E#$2F +
       #$30#$31#$32#$33#$34#$35#$36#$37#$38#$39#$3A#$3B#$3C#$3D#$3E#$3F +
       #$40#$41#$42#$43#$44#$45#$46#$47#$48#$49#$4A#$4B#$4C#$4D#$4E#$4F +
       #$50#$51#$52#$53#$54#$55#$56#$57#$58#$59#$5A#$5B#$5C#$5D#$5E#$5F +
       #$60#$61#$62#$63#$64#$65#$66#$67#$68#$69#$6A#$6B#$6C#$6D#$6E#$6F +
       #$70#$71#$72#$73#$74#$75#$76#$77#$78#$79#$7A#$7B#$7C#$7D#$7E#$7F +
       #$C4#$B3#$DA#$BF#$C0#$D9#$C3#$B4#$C2#$C1#$C5#$DF#$DC#$DB#$DD#$DE +
       #$B0#$B1#$B2#$93#$FE#$F9#$FB#$97#$98#$99#$FF#$9B#$F8#$9D#$FA#$9F +
       #$CD#$BA#$D5#$F1#$F3#$C9#$A6#$F5#$BB#$D4#$D3#$C8#$BE#$AD#$BC#$C6 +
       #$C7#$CC#$B5#$F0#$B4#$B9#$B6#$F4#$CB#$CF#$D0#$CA#$D8#$BD#$CE#$BF +
       #$EE#$A0#$A1#$E6#$A4#$A5#$E4#$A3#$E5#$A8#$A9#$AA#$AB#$AC#$AD#$AE +
       #$AF#$EF#$E0#$E1#$E2#$E3#$A6#$A2#$EC#$EB#$A7#$E8#$ED#$E9#$E7#$EA +
       #$9E#$80#$81#$96#$84#$85#$94#$83#$95#$88#$89#$8A#$8B#$8C#$8D#$8E +
       #$8F#$9F#$90#$91#$92#$93#$86#$82#$9C#$9B#$87#$98#$9D#$99#$97#$9A ;
       convkoi8u_to_koi8r : TCodeTable =
       #$00#$01#$02#$03#$04#$05#$06#$07#$08#$09#$0A#$0B#$0C#$0D#$0E#$0F +
       #$10#$11#$12#$13#$14#$15#$16#$17#$18#$19#$1A#$1B#$1C#$1D#$1E#$1F +
       #$20#$21#$22#$23#$24#$25#$26#$27#$28#$29#$2A#$2B#$2C#$2D#$2E#$2F +
       #$30#$31#$32#$33#$34#$35#$36#$37#$38#$39#$3A#$3B#$3C#$3D#$3E#$3F +
       #$40#$41#$42#$43#$44#$45#$46#$47#$48#$49#$4A#$4B#$4C#$4D#$4E#$4F +
       #$50#$51#$52#$53#$54#$55#$56#$57#$58#$59#$5A#$5B#$5C#$5D#$5E#$5F +
       #$60#$61#$62#$63#$64#$65#$66#$67#$68#$69#$6A#$6B#$6C#$6D#$6E#$6F +
       #$70#$71#$72#$73#$74#$75#$76#$77#$78#$79#$7A#$7B#$7C#$7D#$7E#$7F +
       #$80#$81#$82#$83#$84#$85#$86#$87#$88#$89#$8A#$8B#$8C#$8D#$8E#$8F +
       #$90#$91#$92#$93#$94#$95#$96#$97#$98#$99#$9A#$9B#$9C#$9D#$9E#$9F +
       #$A0#$A1#$A2#$A3#$A4#$A5#$A6#$A7#$A8#$A9#$AA#$AB#$AC#$AD#$AE#$AF +
       #$B0#$B1#$B2#$B3#$B4#$B5#$B6#$B7#$B8#$B9#$BA#$BB#$BC#$BD#$BE#$BF +
       #$C0#$C1#$C2#$C3#$C4#$C5#$C6#$C7#$C8#$C9#$CA#$CB#$CC#$CD#$CE#$CF +
       #$D0#$D1#$D2#$D3#$D4#$D5#$D6#$D7#$D8#$D9#$DA#$DB#$DC#$DD#$DE#$DF +
       #$E0#$E1#$E2#$E3#$E4#$E5#$E6#$E7#$E8#$E9#$EA#$EB#$EC#$ED#$EE#$EF +
       #$F0#$F1#$F2#$F3#$F4#$F5#$F6#$F7#$F8#$F9#$FA#$FB#$FC#$FD#$FE#$FF ;

       conv1251_to_U : TUCodeTable =
       #$00#$00#$00#$01#$00#$02#$00#$03#$00#$04#$00#$05#$00#$06#$00#$07 +
       #$00#$08#$00#$09#$00#$0A#$00#$0B#$00#$0C#$00#$0D#$00#$0E#$00#$0F +
       #$00#$10#$00#$11#$00#$12#$00#$13#$00#$14#$00#$15#$00#$16#$00#$17 +
       #$00#$18#$00#$19#$00#$1A#$00#$1B#$00#$1C#$00#$1D#$00#$1E#$00#$1F +
       #$00#$20#$00#$21#$00#$22#$00#$23#$00#$24#$00#$25#$00#$26#$00#$27 +
       #$00#$28#$00#$29#$00#$2A#$00#$2B#$00#$2C#$00#$2D#$00#$2E#$00#$2F +
       #$00#$30#$00#$31#$00#$32#$00#$33#$00#$34#$00#$35#$00#$36#$00#$37 +
       #$00#$38#$00#$39#$00#$3A#$00#$3B#$00#$3C#$00#$3D#$00#$3E#$00#$3F +
       #$00#$40#$00#$41#$00#$42#$00#$43#$00#$44#$00#$45#$00#$46#$00#$47 +
       #$00#$48#$00#$49#$00#$4A#$00#$4B#$00#$4C#$00#$4D#$00#$4E#$00#$4F +
       #$00#$50#$00#$51#$00#$52#$00#$53#$00#$54#$00#$55#$00#$56#$00#$57 +
       #$00#$58#$00#$59#$00#$5A#$00#$5B#$00#$5C#$00#$5D#$00#$5E#$00#$5F +
       #$00#$60#$00#$61#$00#$62#$00#$63#$00#$64#$00#$65#$00#$66#$00#$67 +
       #$00#$68#$00#$69#$00#$6A#$00#$6B#$00#$6C#$00#$6D#$00#$6E#$00#$6F +
       #$00#$70#$00#$71#$00#$72#$00#$73#$00#$74#$00#$75#$00#$76#$00#$77 +
       #$00#$78#$00#$79#$00#$7A#$00#$7B#$00#$7C#$00#$7D#$00#$7E#$00#$7F +
       #$04#$02#$04#$03#$20#$1A#$04#$53#$20#$1E#$20#$26#$20#$20#$20#$21 +
       #$20#$AC#$20#$30#$04#$09#$20#$39#$04#$0A#$04#$0C#$04#$0B#$04#$0F +
       #$04#$52#$20#$18#$20#$19#$20#$1C#$20#$1D#$20#$22#$20#$13#$20#$14 +
       #$00#$98#$21#$22#$04#$59#$20#$3A#$04#$5A#$04#$5C#$04#$5B#$04#$5F +
       #$00#$A0#$04#$0E#$04#$5E#$04#$08#$00#$A4#$04#$90#$00#$A6#$00#$A7 +
       #$04#$01#$00#$A9#$04#$04#$00#$AB#$00#$AC#$00#$AD#$00#$AE#$04#$07 +
       #$00#$B0#$00#$B1#$04#$06#$04#$56#$04#$91#$00#$B5#$00#$B6#$00#$B7 +
       #$04#$51#$21#$16#$04#$54#$00#$BB#$04#$58#$04#$05#$04#$55#$04#$57 +
       #$04#$10#$04#$11#$04#$12#$04#$13#$04#$14#$04#$15#$04#$16#$04#$17 +
       #$04#$18#$04#$19#$04#$1A#$04#$1B#$04#$1C#$04#$1D#$04#$1E#$04#$1F +
       #$04#$20#$04#$21#$04#$22#$04#$23#$04#$24#$04#$25#$04#$26#$04#$27 +
       #$04#$28#$04#$29#$04#$2A#$04#$2B#$04#$2C#$04#$2D#$04#$2E#$04#$2F +
       #$04#$30#$04#$31#$04#$32#$04#$33#$04#$34#$04#$35#$04#$36#$04#$37 +
       #$04#$38#$04#$39#$04#$3A#$04#$3B#$04#$3C#$04#$3D#$04#$3E#$04#$3F +
       #$04#$40#$04#$41#$04#$42#$04#$43#$04#$44#$04#$45#$04#$46#$04#$47 +
       #$04#$48#$04#$49#$04#$4A#$04#$4B#$04#$4C#$04#$4D#$04#$4E#$04#$4F ;

       conv866_to_U : TUCodeTable =
       #$00#$00#$00#$01#$00#$02#$00#$03#$00#$04#$00#$05#$00#$06#$00#$07 +
       #$00#$08#$00#$09#$00#$0A#$00#$0B#$00#$0C#$00#$0D#$00#$0E#$00#$0F +
       #$00#$10#$00#$11#$00#$12#$00#$13#$00#$14#$00#$15#$00#$16#$00#$17 +
       #$00#$18#$00#$19#$00#$1A#$00#$1B#$00#$1C#$00#$1D#$00#$1E#$00#$1F +
       #$00#$20#$00#$21#$00#$22#$00#$23#$00#$24#$00#$25#$00#$26#$00#$27 +
       #$00#$28#$00#$29#$00#$2A#$00#$2B#$00#$2C#$00#$2D#$00#$2E#$00#$2F +
       #$00#$30#$00#$31#$00#$32#$00#$33#$00#$34#$00#$35#$00#$36#$00#$37 +
       #$00#$38#$00#$39#$00#$3A#$00#$3B#$00#$3C#$00#$3D#$00#$3E#$00#$3F +
       #$00#$40#$00#$41#$00#$42#$00#$43#$00#$44#$00#$45#$00#$46#$00#$47 +
       #$00#$48#$00#$49#$00#$4A#$00#$4B#$00#$4C#$00#$4D#$00#$4E#$00#$4F +
       #$00#$50#$00#$51#$00#$52#$00#$53#$00#$54#$00#$55#$00#$56#$00#$57 +
       #$00#$58#$00#$59#$00#$5A#$00#$5B#$00#$5C#$00#$5D#$00#$5E#$00#$5F +
       #$00#$60#$00#$61#$00#$62#$00#$63#$00#$64#$00#$65#$00#$66#$00#$67 +
       #$00#$68#$00#$69#$00#$6A#$00#$6B#$00#$6C#$00#$6D#$00#$6E#$00#$6F +
       #$00#$70#$00#$71#$00#$72#$00#$73#$00#$74#$00#$75#$00#$76#$00#$77 +
       #$00#$78#$00#$79#$00#$7A#$00#$7B#$00#$7C#$00#$7D#$00#$7E#$00#$7F +
       #$04#$10#$04#$11#$04#$12#$04#$13#$04#$14#$04#$15#$04#$16#$04#$17 +
       #$04#$18#$04#$19#$04#$1A#$04#$1B#$04#$1C#$04#$1D#$04#$1E#$04#$1F +
       #$04#$20#$04#$21#$04#$22#$04#$23#$04#$24#$04#$25#$04#$26#$04#$27 +
       #$04#$28#$04#$29#$04#$2A#$04#$2B#$04#$2C#$04#$2D#$04#$2E#$04#$2F +
       #$04#$30#$04#$31#$04#$32#$04#$33#$04#$34#$04#$35#$04#$36#$04#$37 +
       #$04#$38#$04#$39#$04#$3A#$04#$3B#$04#$3C#$04#$3D#$04#$3E#$04#$3F +
       #$25#$91#$25#$92#$25#$93#$25#$02#$25#$24#$25#$61#$25#$62#$25#$56 +
       #$25#$55#$25#$63#$25#$51#$25#$57#$25#$5D#$25#$5C#$25#$5B#$25#$10 +
       #$25#$14#$25#$34#$25#$2C#$25#$1C#$25#$00#$25#$3C#$25#$5E#$25#$5F +
       #$25#$5A#$25#$54#$25#$69#$25#$66#$25#$60#$25#$50#$25#$6C#$25#$67 +
       #$25#$68#$25#$64#$25#$65#$25#$59#$25#$58#$25#$52#$25#$53#$25#$6B +
       #$25#$6A#$25#$18#$25#$0C#$25#$88#$25#$84#$25#$8C#$25#$90#$25#$80 +
       #$04#$40#$04#$41#$04#$42#$04#$43#$04#$44#$04#$45#$04#$46#$04#$47 +
       #$04#$48#$04#$49#$04#$4A#$04#$4B#$04#$4C#$04#$4D#$04#$4E#$04#$4F +
       #$04#$01#$04#$51#$04#$04#$04#$54#$04#$07#$04#$57#$04#$0E#$04#$5E +
       #$00#$B0#$22#$19#$00#$B7#$22#$1A#$21#$16#$00#$A4#$25#$A0#$00#$A0 ;

       convkoi8r_to_U : TUCodeTable =
       #$00#$00#$00#$01#$00#$02#$00#$03#$00#$04#$00#$05#$00#$06#$00#$07 +
       #$00#$08#$00#$09#$00#$0A#$00#$0B#$00#$0C#$00#$0D#$00#$0E#$00#$0F +
       #$00#$10#$00#$11#$00#$12#$00#$13#$00#$14#$00#$15#$00#$16#$00#$17 +
       #$00#$18#$00#$19#$00#$1A#$00#$1B#$00#$1C#$00#$1D#$00#$1E#$00#$1F +
       #$00#$20#$00#$21#$00#$22#$00#$23#$00#$24#$00#$25#$00#$26#$00#$27 +
       #$00#$28#$00#$29#$00#$2A#$00#$2B#$00#$2C#$00#$2D#$00#$2E#$00#$2F +
       #$00#$30#$00#$31#$00#$32#$00#$33#$00#$34#$00#$35#$00#$36#$00#$37 +
       #$00#$38#$00#$39#$00#$3A#$00#$3B#$00#$3C#$00#$3D#$00#$3E#$00#$3F +
       #$00#$40#$00#$41#$00#$42#$00#$43#$00#$44#$00#$45#$00#$46#$00#$47 +
       #$00#$48#$00#$49#$00#$4A#$00#$4B#$00#$4C#$00#$4D#$00#$4E#$00#$4F +
       #$00#$50#$00#$51#$00#$52#$00#$53#$00#$54#$00#$55#$00#$56#$00#$57 +
       #$00#$58#$00#$59#$00#$5A#$00#$5B#$00#$5C#$00#$5D#$00#$5E#$00#$5F +
       #$00#$60#$00#$61#$00#$62#$00#$63#$00#$64#$00#$65#$00#$66#$00#$67 +
       #$00#$68#$00#$69#$00#$6A#$00#$6B#$00#$6C#$00#$6D#$00#$6E#$00#$6F +
       #$00#$70#$00#$71#$00#$72#$00#$73#$00#$74#$00#$75#$00#$76#$00#$77 +
       #$00#$78#$00#$79#$00#$7A#$00#$7B#$00#$7C#$00#$7D#$00#$7E#$00#$7F +
       #$25#$00#$25#$02#$25#$0C#$25#$10#$25#$14#$25#$18#$25#$1C#$25#$24 +
       #$25#$2C#$25#$34#$25#$3C#$25#$80#$25#$84#$25#$88#$25#$8C#$25#$90 +
       #$25#$91#$25#$92#$25#$93#$23#$20#$25#$A0#$22#$19#$22#$1A#$22#$48 +
       #$22#$64#$22#$65#$00#$A0#$23#$21#$00#$B0#$00#$B2#$00#$B7#$00#$F7 +
       #$25#$50#$25#$51#$25#$52#$04#$51#$25#$53#$25#$54#$25#$55#$25#$56 +
       #$25#$57#$25#$58#$25#$59#$25#$5A#$25#$5B#$25#$5C#$25#$5D#$25#$5E +
       #$25#$5F#$25#$60#$25#$61#$04#$01#$25#$62#$25#$63#$25#$64#$25#$65 +
       #$25#$66#$25#$67#$25#$68#$25#$69#$25#$6A#$25#$6B#$25#$6C#$00#$A9 +
       #$04#$4E#$04#$30#$04#$31#$04#$46#$04#$34#$04#$35#$04#$44#$04#$33 +
       #$04#$45#$04#$38#$04#$39#$04#$3A#$04#$3B#$04#$3C#$04#$3D#$04#$3E +
       #$04#$3F#$04#$4F#$04#$40#$04#$41#$04#$42#$04#$43#$04#$36#$04#$32 +
       #$04#$4C#$04#$4B#$04#$37#$04#$48#$04#$4D#$04#$49#$04#$47#$04#$4A +
       #$04#$2E#$04#$10#$04#$11#$04#$26#$04#$14#$04#$15#$04#$24#$04#$13 +
       #$04#$25#$04#$18#$04#$19#$04#$1A#$04#$1B#$04#$1C#$04#$1D#$04#$1E +
       #$04#$1F#$04#$2F#$04#$20#$04#$21#$04#$22#$04#$23#$04#$16#$04#$12 +
       #$04#$2C#$04#$2B#$04#$17#$04#$28#$04#$2D#$04#$29#$04#$27#$04#$2A ;

       convkoi8u_to_U : TUCodeTable =
       #$00#$00#$00#$01#$00#$02#$00#$03#$00#$04#$00#$05#$00#$06#$00#$07 +
       #$00#$08#$00#$09#$00#$0A#$00#$0B#$00#$0C#$00#$0D#$00#$0E#$00#$0F +
       #$00#$10#$00#$11#$00#$12#$00#$13#$00#$14#$00#$15#$00#$16#$00#$17 +
       #$00#$18#$00#$19#$00#$1A#$00#$1B#$00#$1C#$00#$1D#$00#$1E#$00#$1F +
       #$00#$20#$00#$21#$00#$22#$00#$23#$00#$24#$00#$25#$00#$26#$00#$27 +
       #$00#$28#$00#$29#$00#$2A#$00#$2B#$00#$2C#$00#$2D#$00#$2E#$00#$2F +
       #$00#$30#$00#$31#$00#$32#$00#$33#$00#$34#$00#$35#$00#$36#$00#$37 +
       #$00#$38#$00#$39#$00#$3A#$00#$3B#$00#$3C#$00#$3D#$00#$3E#$00#$3F +
       #$00#$40#$00#$41#$00#$42#$00#$43#$00#$44#$00#$45#$00#$46#$00#$47 +
       #$00#$48#$00#$49#$00#$4A#$00#$4B#$00#$4C#$00#$4D#$00#$4E#$00#$4F +
       #$00#$50#$00#$51#$00#$52#$00#$53#$00#$54#$00#$55#$00#$56#$00#$57 +
       #$00#$58#$00#$59#$00#$5A#$00#$5B#$00#$5C#$00#$5D#$00#$5E#$00#$5F +
       #$00#$60#$00#$61#$00#$62#$00#$63#$00#$64#$00#$65#$00#$66#$00#$67 +
       #$00#$68#$00#$69#$00#$6A#$00#$6B#$00#$6C#$00#$6D#$00#$6E#$00#$6F +
       #$00#$70#$00#$71#$00#$72#$00#$73#$00#$74#$00#$75#$00#$76#$00#$77 +
       #$00#$78#$00#$79#$00#$7A#$00#$7B#$00#$7C#$00#$7D#$00#$7E#$00#$7F +
       #$25#$00#$25#$02#$25#$0C#$25#$10#$25#$14#$25#$18#$25#$1C#$25#$24 +
       #$25#$2C#$25#$34#$25#$3C#$25#$80#$25#$84#$25#$88#$25#$8C#$25#$90 +
       #$25#$91#$25#$92#$25#$93#$23#$20#$25#$A0#$22#$19#$22#$1A#$22#$48 +
       #$22#$64#$22#$65#$00#$A0#$23#$21#$00#$B0#$00#$B2#$00#$B7#$00#$F7 +
       #$25#$50#$25#$51#$25#$52#$04#$51#$04#$54#$25#$54#$04#$56#$04#$57 +
       #$25#$57#$25#$58#$25#$59#$25#$5A#$25#$5B#$04#$91#$25#$5D#$25#$5E +
       #$25#$5F#$25#$60#$25#$61#$04#$01#$04#$03#$25#$63#$04#$06#$04#$07 +
       #$25#$66#$25#$67#$25#$68#$25#$69#$25#$6A#$04#$90#$25#$6C#$00#$A9 +
       #$04#$4E#$04#$30#$04#$31#$04#$46#$04#$34#$04#$35#$04#$44#$04#$33 +
       #$04#$45#$04#$38#$04#$39#$04#$3A#$04#$3B#$04#$3C#$04#$3D#$04#$3E +
       #$04#$3F#$04#$4F#$04#$40#$04#$41#$04#$42#$04#$43#$04#$36#$04#$32 +
       #$04#$4C#$04#$4B#$04#$37#$04#$48#$04#$4D#$04#$49#$04#$47#$04#$4A +
       #$04#$2E#$04#$10#$04#$11#$04#$26#$04#$14#$04#$15#$04#$24#$04#$13 +
       #$04#$25#$04#$18#$04#$19#$04#$1A#$04#$1B#$04#$1C#$04#$1D#$04#$1E +
       #$04#$1F#$04#$2F#$04#$20#$04#$21#$04#$22#$04#$23#$04#$16#$04#$12 +
       #$04#$2C#$04#$2B#$04#$17#$04#$28#$04#$2D#$04#$29#$04#$27#$04#$2A ;

       cpconv_tables  : array [cp1251..koi8u,cp1251..koi8u] of ^TCodeTable =
       ((nil,@conv1251_to_866,@conv1251_to_koi8r,@conv1251_to_koi8u),
       (@conv866_to_1251,nil,@conv866_to_koi8r,@conv866_to_koi8u),
       (@convkoi8r_to_1251,@convkoi8r_to_866,nil,@convkoi8r_to_koi8u),
       (@convkoi8u_to_1251,@convkoi8u_to_866,@convkoi8u_to_koi8r,nil));

       cpconv_tablesU : array [cp1251..koi8u] of ^TUCodeTable =
       (@conv1251_to_U,@conv866_to_U,@convkoi8r_to_U,@convkoi8u_to_U);

// var

function Conv  (cp_from,cp_to : TCodePage; str : String) : String;
function ConvU (cp_from : TCodePage; str : String)       : String;
function ConvFromU (cp_to : TCodePage; str : String)     : String;
//var

implementation

function Conv (cp_from,cp_to : TCodePage; str : String) :String;
var i : integer;
var tab : TCodeTable;
begin

tab  :=  cpconv_tables[cp_from][cp_to]^;
result := '';
for i := 1 to Length(str) do
begin
  result := result + tab[integer(str[i])];
end;

end;

function ConvU (cp_from : TCodePage; str : String) : String;
var i : integer;
var tab : TUCodeTable;
begin

tab  :=  cpconv_tablesU[cp_from]^;
ConvU := '';
for i := 1 to Length(str) do
begin
  result := result + tab[integer(str[i]) * 2 + 1] + tab[integer(str[i]) * 2];
end;

end;

function ConvFromU (cp_to : TCodePage; str : String) : String;
var i,j   : integer;
    tab : TUCodeTable;
    s   : char;

begin
tab       := cpconv_tablesU[cp_to]^;
ConvFromU := '';
i := 0;

while i <= Length(str)/2-1 do
begin
 
  s := #$00;
  for j := 0 to 255 do
  begin
    if tab[j*2] + tab[j*2+1] = str[i*2] + str[i*2+1] then
      begin
        s := char(j);
        break;
      end;

  end;
  result := result + s;
  i := i + 1;
end;

end;
end.

ViruZ
постоялец
 
Сообщения: 170
Зарегистрирован: 30.05.2005 17:41:12
Откуда: Украина

Сообщение Attid » 17.01.2008 22:29:25

в CodeChanger (ссылку давал ранее) такой код

Код: Выделить всё
function DosToUnicode(var Text: string): boolean;
var InString, OutString, b: string;
    i, Len: integer;
    c: byte;
    a: Char;
begin
Result:=true;
InString:=Text; OutString:='';
Len:=Length(InString);
try
        b:=#255#254; OutString:=OutString+b;
        for i:=1 to Len do begin
                a:=InString[i];
                c:=Ord(a);
                case c of
{a english}             97: b:=#97#0; 98: b:=#98#0; 99: b:=#99#0; 100: b:=#100#0; 101: b:=#101#0; 102: b:=#102#0; 103: b:=#103#0; 104: b:=#104#0; 105: b:=#105#0; 106: b:=#106#0; 107: b:=#107#0; 108: b:=#108#0; 109: b:=#109#0; 110: b:=#110#0; 111: b:=#111#0; 112: b:=#112#0; 113: b:=#113#0; 114: b:=#114#0; 115: b:=#115#0; 116: b:=#116#0; 117: b:=#117#0; 118: b:=#118#0; 119: b:=#119#0; 120: b:=#120#0; 121: b:=#121#0; 122: b:=#122#0;
{A english}             65: b:=#65#0; 66: b:=#66#0; 67: b:=#67#0; 68: b:=#68#0; 69: b:=#69#0; 70: b:=#70#0; 71: b:=#71#0; 72: b:=#72#0; 73: b:=#73#0; 74: b:=#74#0; 75: b:=#75#0; 76: b:=#76#0; 77: b:=#77#0; 78: b:=#78#0; 79: b:=#79#0; 80: b:=#80#0; 81: b:=#81#0; 82: b:=#82#0; 83: b:=#83#0; 84: b:=#84#0; 85: b:=#85#0; 86: b:=#86#0; 87: b:=#87#0; 88: b:=#88#0; 89: b:=#89#0; 90: b:=#90#0;
{0..9}                  48: b:=#48#0; 49: b:=#49#0; 50: b:=#50#0; 51: b:=#51#0; 52: b:=#52#0; 53: b:=#53#0; 54: b:=#54#0; 55: b:=#55#0; 56: b:=#56#0; 57: b:=#57#0;
{Спец символы}          33: b:=#33#0; 13: b:=#13#0; 9: b:=#9#0; 10: b:=#10#0; 32: b:=#32#0; 64: b:=#64#0; 35: b:=#35#0; 36: b:=#36#0; 37: b:=#37#0; 94: b:=#94#0; 38: b:=#38#0; 42: b:=#42#0; 40: b:=#40#0; 41: b:=#41#0; 45: b:=#45#0; 95: b:=#95#0; 43: b:=#43#0; 61: b:=#61#0; 92: b:=#92#0; 47: b:=#47#0; 124: b:=#124#0; 46: b:=#46#0; 44: b:=#44#0; 59: b:=#59#0; 58: b:=#58#0; 123: b:=#123#0; 125: b:=#125#0; 63: b:=#63#0; 60: b:=#60#0; 62: b:=#62#0; 34: b:=#34#0; 91: b:=#91#0; 93: b:=#93#0; 96: b:=#96#0; 126: b:=#126#0; 252: b:=#22#33;
{а русские}             160: b:=#48#4; 161: b:=#49#4; 162: b:=#50#4; 163: b:=#51#4; 164: b:=#52#4; 165: b:=#53#4; 166: b:=#54#4; 167: b:=#55#4; 168: b:=#56#4; 169: b:=#57#4; 170: b:=#58#4; 171: b:=#59#4; 172: b:=#60#4; 173: b:=#61#4; 174: b:=#62#4; 175: b:=#63#4; 224: b:=#64#4; 225: b:=#65#4; 226: b:=#66#4; 227: b:=#67#4; 228: b:=#68#4; 229: b:=#69#4; 230: b:=#70#4; 231: b:=#71#4; 232: b:=#72#4; 233: b:=#73#4; 234: b:=#74#4; 235: b:=#75#4; 236: b:=#76#4; 237: b:=#77#4; 238: b:=#78#4; 239: b:=#79#4; 241: b:=#81#4;
{А русские}             128: b:=#16#4; 129: b:=#17#4; 130: b:=#18#4; 131: b:=#19#4; 132: b:=#20#4; 133: b:=#21#4; 134: b:=#22#4; 135: b:=#23#4; 136: b:=#24#4; 137: b:=#25#4; 138: b:=#26#4; 139: b:=#27#4; 140: b:=#28#4; 141: b:=#29#4; 142: b:=#30#4; 143: b:=#31#4; 144: b:=#32#4; 145: b:=#33#4; 146: b:=#34#4; 147: b:=#35#4; 148: b:=#36#4;  149: b:=#37#4; 150: b:=#38#4; 151: b:=#39#4; 152: b:=#40#4; 153: b:=#41#4; 154: b:=#42#4; 155: b:=#43#4; 156: b:=#44#4; 157: b:=#45#4; 158: b:=#46#4; 159: b:=#47#4; 240: b:=#1#4
                        end;
                OutString:=OutString+b
                end;
        Text:= OutString
        except
        Result:=false
        end
end;


если только в лине то можно iconv посмотреть.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2583
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Alexander » 18.01.2008 00:39:21

ViruZ писал(а):оригинальная программа вылетает в трубу с потерей измененных данных (пробовал DosBox).


Попробуй dosemu, dosbox заточен больше под игры.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 582
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Сообщение ViruZ » 18.01.2008 10:31:51

Attid
В том и фокус, что нужно кросс-платформа вин/лин.

Alexander
А Dosemu поддерживает печать на LPT и обмен данными с принтером? Под Виндой пробовал последнюю версию DosBox, программа работает, но принтера не видит, пишет Printer not ready, хотя если печатать напрямую в порт (команда copy c:\test.txt prn), текст распечатывается.
ViruZ
постоялец
 
Сообщения: 170
Зарегистрирован: 30.05.2005 17:41:12
Откуда: Украина

Сообщение Attid » 18.01.2008 11:57:27

ну на еще обратную

Код: Выделить всё
function UnicodeToDos(var Text: string): boolean;
var InString, OutString: string;
    i, Len: integer;
    b: Char;
begin
Result:=true; i:=1;
InString:=Text; OutString:='';
Delete(InString, 1, 2);
Len:=Length(InString);
try
   repeat
     case InString[i+1] of
        #0: case InString[i] of
{a english}     #97: b:=#97; #98: b:=#98; #99: b:=#99; #100: b:=#100; #101: b:=#101; #102: b:=#102; #103: b:=#103; #104: b:=#104; #105: b:=#105; #106: b:=#106; #107: b:=#107; #108: b:=#108; #109: b:=#109; #110: b:=#110; #111: b:=#111; #112: b:=#112; #113: b:=#113; #114: b:=#114; #115: b:=#115; #116: b:=#116; #117: b:=#117; #118: b:=#118; #119: b:=#119; #120: b:=#120; #121: b:=#121; #122: b:=#122;
{A english}     #65: b:=#65; #66: b:=#66; #67: b:=#67; #68: b:=#68; #69: b:=#67; #70: b:=#70; #71: b:=#71; #72: b:=#72; #73: b:=#73; #74: b:=#74; #75: b:=#75; #76: b:=#76; #77: b:=#77; #78: b:=#78; #79: b:=#79; #80: b:=#80; #81: b:=#81; #82: b:=#82; #83: b:=#83; #84: b:=#84; #85: b:=#85; #86: b:=#86; #87: b:=#87; #88: b:=#88; #89: b:=#89; #90: b:=#90;
{0..9}          #48: b:=#48; #49: b:=#49; #50: b:=#50; #51: b:=#51; #52: b:=#52; #53: b:=#53; #54: b:=#54; #55: b:=#55; #56: b:=#56; #57: b:=#57;
{Спец символы}  #33: b:=#33; #13: b:=#13; #9: b:=#9; #10: b:=#10; #32: b:=#32; #64: b:=#64; #35: b:=#35; #36: b:=#36; #37: b:=#37; #94: b:=#94; #38: b:=#38; #42: b:=#42; #40: b:=#40; #41: b:=#41; #45: b:=#45; #95: b:=#95; #43: b:=#43; #61: b:=#61; #92: b:=#92; #47: b:=#47; #124: b:=#124; #46: b:=#46; #44: b:=#44; #59: b:=#59; #58: b:=#58; #123: b:=#123; #125: b:=#125; #63: b:=#63; #60: b:=#60; #62: b:=#62; #34: b:=#34; #91: b:=#91; #93: b:=#93; #96: b:=#96; #126: b:=#126
                      end;
       #4: case InString[i] of
{а русские}     #48: b:=#160; #49: b:=#161; #50: b:=#162; #51: b:=#163; #52: b:=#164; #53: b:=#165; #54: b:=#166; #55: b:=#167; #56: b:=#168; #57: b:=#169; #58: b:=#170; #59: b:=#171; #60: b:=#172; #61: b:=#173; #62: b:=#174; #63: b:=#175; #64: b:=#224; #65: b:=#225; #66: b:=#226; #67: b:=#227; #68: b:=#228; #69: b:=#229; #70: b:=#230; #71: b:=#231; #72: b:=#232; #73: b:=#233; #74: b:=#234; #75: b:=#235; #76: b:=#236; #77: b:=#237; #78: b:=#238; #79: b:=#239; #81: b:=#241;
{А русские}     #16: b:=#128; #17: b:=#129; #18: b:=#130; #19: b:=#131; #20: b:=#132; #21: b:=#133; #22: b:=#134; #23: b:=#135; #24: b:=#136; #25: b:=#137; #26: b:=#138; #27: b:=#139; #28: b:=#140; #29: b:=#141; #30: b:=#142; #31: b:=#143; #32: b:=#144; #33: b:=#145; #34: b:=#146; #35: b:=#147; #36: b:=#148; #37: b:=#149; #38: b:=#150; #39: b:=#151; #40: b:=#152; #41: b:=#153; #42: b:=#154; #43: b:=#155; #44: b:=#156; #45: b:=#157; #46: b:=#158; #47: b:=#159; #1: b:=#240
                      end
         else if (InString[i]=#84) and (InString[i+1]=#70) then b:=#252
       end;
      OutString:=OutString+b;
     i:=i+2
   until i>Len;
  Text:=OutString
  except
  Result:=false
  end
end;
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2583
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Vlad04 » 19.01.2008 18:14:55

Я, вообще-то, в Линуксе не писал, но сталкивался с вопросом перевода Win 1251 в Unicode. Вся разница заключается в том, что Win 1251, как и в OEM 866, под символ отводится 1 байт, а в Unicode 2 байта. Процедура получилась простая. Результат массив word в котором нулевой элемент указывает количество символов:

Код: Выделить всё
type
    TUnicodeArray = array[0..8191] of word ;
    PUnicodeArray = ^TUnicodeArray ;

const
    UnicodeWinConvertTable : array[0..255] of word = (
          $0000, {NULL                                            }
          $0001, {START OF HEADING                                }
          $0002, {START OF TEXT                                   }
          $0003, {END OF TEXT                                     }
          $0004, {END OF TRANSMISSION                             }
          $0005, {ENQUIRY                                         }
          $0006, {ACKNOWLEDGE                                     }
          $0007, {BELL                                            }
          $0008, {BACKSPACE                                       }
          $0009, {HORIZONTAL TABULATION                           }
          $000A, {LINE FEED                                       }
          $000B, {VERTICAL TABULATION                             }
          $000C, {FORM FEED                                       }
          $000D, {CARRIAGE RETURN                                 }
          $000E, {SHIFT OUT                                       }
          $000F, {SHIFT IN                                        }
          $0010, {DATA LINK ESCAPE                                }
          $0011, {DEVICE CONTROL ONE                              }
          $0012, {DEVICE CONTROL TWO                              }
          $0013, {DEVICE CONTROL THREE                            }
          $0014, {DEVICE CONTROL FOUR                             }
          $0015, {NEGATIVE ACKNOWLEDGE                            }
          $0016, {SYNCHRONOUS IDLE                                }
          $0017, {END OF TRANSMISSION BLOCK                       }
          $0018, {CANCEL                                          }
          $0019, {END OF MEDIUM                                   }
          $001A, {SUBSTITUTE                                      }
          $001B, {ESCAPE                                          }
          $001C, {FILE SEPARATOR                                  }
          $001D, {GROUP SEPARATOR                                 }
          $001E, {RECORD SEPARATOR                                }
          $001F, {UNIT SEPARATOR                                  }
          $0020, {SPACE                                           }
          $0021, {EXCLAMATION MARK                                }
          $0022, {QUOTATION MARK                                  }
          $0023, {NUMBER SIGN                                     }
          $0024, {DOLLAR SIGN                                     }
          $0025, {PERCENT SIGN                                    }
          $0026, {AMPERSAND                                       }
          $0027, {APOSTROPHE                                      }
          $0028, {LEFT PARENTHESIS                                }
          $0029, {RIGHT PARENTHESIS                               }
          $002A, {ASTERISK                                        }
          $002B, {PLUS SIGN                                       }
          $002C, {COMMA                                           }
          $002D, {HYPHEN-MINUS                                    }
          $002E, {FULL STOP                                       }
          $002F, {SOLIDUS                                         }
          $0030, {DIGIT ZERO                                      }
          $0031, {DIGIT ONE                                       }
          $0032, {DIGIT TWO                                       }
          $0033, {DIGIT THREE                                     }
          $0034, {DIGIT FOUR                                      }
          $0035, {DIGIT FIVE                                      }
          $0036, {DIGIT SIX                                       }
          $0037, {DIGIT SEVEN                                     }
          $0038, {DIGIT EIGHT                                     }
          $0039, {DIGIT NINE                                      }
          $003A, {COLON                                           }
          $003B, {SEMICOLON                                       }
          $003C, {LESS-THAN SIGN                                  }
          $003D, {EQUALS SIGN                                     }
          $003E, {GREATER-THAN SIGN                               }
          $003F, {QUESTION MARK                                   }
          $0040, {COMMERCIAL AT                                   }
          $0041, {LATIN CAPITAL LETTER A                          }
          $0042, {LATIN CAPITAL LETTER B                          }
          $0043, {LATIN CAPITAL LETTER C                          }
          $0044, {LATIN CAPITAL LETTER D                           }
          $0045, {LATIN CAPITAL LETTER E                           }
          $0046, {LATIN CAPITAL LETTER F                           }
          $0047, {LATIN CAPITAL LETTER G                           }
          $0048, {LATIN CAPITAL LETTER H                           }
          $0049, {LATIN CAPITAL LETTER I                           }
          $004A, {LATIN CAPITAL LETTER J                           }
          $004B, {LATIN CAPITAL LETTER K                           }
          $004C, {LATIN CAPITAL LETTER L                           }
          $004D, {LATIN CAPITAL LETTER M                           }
          $004E, {LATIN CAPITAL LETTER N                           }
          $004F, {LATIN CAPITAL LETTER O                           }
          $0050, {LATIN CAPITAL LETTER P                           }
          $0051, {LATIN CAPITAL LETTER Q                           }
          $0052, {LATIN CAPITAL LETTER R                           }
          $0053, {LATIN CAPITAL LETTER S                           }
          $0054, {LATIN CAPITAL LETTER T                           }
          $0055, {LATIN CAPITAL LETTER U                           }
          $0056, {LATIN CAPITAL LETTER V                           }
          $0057, {LATIN CAPITAL LETTER W                           }
          $0058, {LATIN CAPITAL LETTER X                           }
          $0059, {LATIN CAPITAL LETTER Y                           }
          $005A, {LATIN CAPITAL LETTER Z                           }
          $005B, {LEFT SQUARE BRACKET                              }
          $005C, {REVERSE SOLIDUS                                  }
          $005D, {RIGHT SQUARE BRACKET                             }
          $005E, {CIRCUMFLEX ACCENT                                }
          $005F, {LOW LINE                                         }
          $0060, {GRAVE ACCENT                                     }
          $0061, {LATIN SMALL LETTER A                             }
          $0062, {LATIN SMALL LETTER B                             }
          $0063, {LATIN SMALL LETTER C                             }
          $0064, {LATIN SMALL LETTER D                             }
          $0065, {LATIN SMALL LETTER E                             }
          $0066, {LATIN SMALL LETTER F                             }
          $0067, {LATIN SMALL LETTER G                             }
          $0068, {LATIN SMALL LETTER H                             }
          $0069, {LATIN SMALL LETTER I                             }
          $006A, {LATIN SMALL LETTER J                             }
          $006B, {LATIN SMALL LETTER K                             }
          $006C, {LATIN SMALL LETTER L                             }
          $006D, {LATIN SMALL LETTER M                             }
          $006E, {LATIN SMALL LETTER N                             }
          $006F, {LATIN SMALL LETTER O                             }
          $0070, {LATIN SMALL LETTER P                             }
          $0071, {LATIN SMALL LETTER Q                             }
          $0072, {LATIN SMALL LETTER R                             }
          $0073, {LATIN SMALL LETTER S                             }
          $0074, {LATIN SMALL LETTER T                             }
          $0075, {LATIN SMALL LETTER U                             }
          $0076, {LATIN SMALL LETTER V                             }
          $0077, {LATIN SMALL LETTER W                             }
          $0078, {LATIN SMALL LETTER X                             }
          $0079, {LATIN SMALL LETTER Y                             }
          $007A, {LATIN SMALL LETTER Z                             }
          $007B, {LEFT CURLY BRACKET                               }
          $007C, {VERTICAL LINE                                    }
          $007D, {RIGHT CURLY BRACKET                              }
          $007E, {TILDE                                            }
          $007F, {DELETE                                           }
          $0402, {CYRILLIC CAPITAL LETTER DJE                      }
          $0403, {CYRILLIC CAPITAL LETTER GJE                      }
          $201A, {SINGLE LOW-9 QUOTATION MARK                      }
          $0453, {CYRILLIC SMALL LETTER GJE                        }
          $201E, {DOUBLE LOW-9 QUOTATION MARK                      }
          $2026, {HORIZONTAL ELLIPSIS                              }
          $2020, {DAGGER                                           }
          $2021, {DOUBLE DAGGER                                    }
          $20AC, {EURO SIGN                                        }
          $2030, {PER MILLE SIGN                                   }
          $0409, {CYRILLIC CAPITAL LETTER LJE                      }
          $2039, {SINGLE LEFT-POINTING ANGLE QUOTATION MARK        }
          $040A, {CYRILLIC CAPITAL LETTER NJE                      }
          $040C, {CYRILLIC CAPITAL LETTER KJE                      }
          $040B, {CYRILLIC CAPITAL LETTER TSHE                     }
          $040F, {CYRILLIC CAPITAL LETTER DZHE                     }
          $0452, {CYRILLIC SMALL LETTER DJE                        }
          $2018, {LEFT SINGLE QUOTATION MARK                       }
          $2019, {RIGHT SINGLE QUOTATION MARK                      }
          $201C, {LEFT DOUBLE QUOTATION MARK                       }
          $201D, {RIGHT DOUBLE QUOTATION MARK                      }
          $2022, {BULLET                                           }
          $2013, {EN DASH                                          }
          $2014, {EM DASH                                          }
          $FFFF, {SPACE                                           }
          $2122, {TRADE MARK SIGN                                  }
          $0459, {CYRILLIC SMALL LETTER LJE                        }
          $203A, {SINGLE RIGHT-POINTING ANGLE QUOTATION MARK       }
          $045A, {CYRILLIC SMALL LETTER NJE                        }
          $045C, {CYRILLIC SMALL LETTER KJE                        }
          $045B, {CYRILLIC SMALL LETTER TSHE                       }
          $045F, {CYRILLIC SMALL LETTER DZHE                       }
          $00A0, {NO-BREAK SPACE                                   }
          $040E, {CYRILLIC CAPITAL LETTER SHORT U                  }
          $045E, {CYRILLIC SMALL LETTER SHORT U                    }
          $0408, {CYRILLIC CAPITAL LETTER JE                       }
          $00A4, {CURRENCY SIGN                                    }
          $0490, {CYRILLIC CAPITAL LETTER GHE WITH UPTURN          }
          $00A6, {BROKEN BAR                                       }
          $00A7, {SECTION SIGN                                     }
          $0401, {CYRILLIC CAPITAL LETTER IO                       }
          $00A9, {COPYRIGHT SIGN                                   }
          $0404, {CYRILLIC CAPITAL LETTER UKRAINIAN IE             }
          $00AB, {LEFT-POINTING DOUBLE ANGLE QUOTATION MARK        }
          $00AC, {NOT SIGN                                         }
          $00AD, {SOFT HYPHEN                                      }
          $00AE, {REGISTERED SIGN                                  }
          $0407, {CYRILLIC CAPITAL LETTER YI                       }
          $00B0, {DEGREE SIGN                                      }
          $00B1, {PLUS-MINUS SIGN                                  }
          $0406, {CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I }
          $0456, {CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I  }
          $0491, {CYRILLIC SMALL LETTER GHE WITH UPTURN      }
          $00B5, {MICRO SIGN                                 }
          $00B6, {PILCROW SIGN                               }
          $00B7, {MIDDLE DOT                                 }
          $0451, {CYRILLIC SMALL LETTER IO                   }
          $2116, {NUMERO SIGN                                }
          $0454, {CYRILLIC SMALL LETTER UKRAINIAN IE         }
          $00BB, {RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK }
          $0458, {CYRILLIC SMALL LETTER JE               }
          $0405, {CYRILLIC CAPITAL LETTER DZE            }
          $0455, {CYRILLIC SMALL LETTER DZE              }
          $0457, {CYRILLIC SMALL LETTER YI               }
          $0410, {CYRILLIC CAPITAL LETTER A              }
          $0411, {CYRILLIC CAPITAL LETTER BE             }
          $0412, {CYRILLIC CAPITAL LETTER VE             }
          $0413, {CYRILLIC CAPITAL LETTER GHE            }
          $0414, {CYRILLIC CAPITAL LETTER DE             }
          $0415, {CYRILLIC CAPITAL LETTER IE             }
          $0416, {CYRILLIC CAPITAL LETTER ZHE            }
          $0417, {CYRILLIC CAPITAL LETTER ZE             }
          $0418, {CYRILLIC CAPITAL LETTER I              }
          $0419, {CYRILLIC CAPITAL LETTER SHORT I        }
          $041A, {CYRILLIC CAPITAL LETTER KA             }
          $041B, {CYRILLIC CAPITAL LETTER EL             }
          $041C, {CYRILLIC CAPITAL LETTER EM             }
          $041D, {CYRILLIC CAPITAL LETTER EN             }
          $041E, {CYRILLIC CAPITAL LETTER O              }
          $041F, {CYRILLIC CAPITAL LETTER PE             }
          $0420, {CYRILLIC CAPITAL LETTER ER             }
          $0421, {CYRILLIC CAPITAL LETTER ES             }
          $0422, {CYRILLIC CAPITAL LETTER TE             }
          $0423, {CYRILLIC CAPITAL LETTER U              }
          $0424, {CYRILLIC CAPITAL LETTER EF             }
          $0425, {CYRILLIC CAPITAL LETTER HA             }
          $0426, {CYRILLIC CAPITAL LETTER TSE            }
          $0427, {CYRILLIC CAPITAL LETTER CHE            }
          $0428, {CYRILLIC CAPITAL LETTER SHA            }
          $0429, {CYRILLIC CAPITAL LETTER SHCHA          }
          $042A, {CYRILLIC CAPITAL LETTER HARD SIGN      }
          $042B, {CYRILLIC CAPITAL LETTER YERU           }
          $042C, {CYRILLIC CAPITAL LETTER SOFT SIGN      }
          $042D, {CYRILLIC CAPITAL LETTER E              }
          $042E, {CYRILLIC CAPITAL LETTER YU             }
          $042F, {CYRILLIC CAPITAL LETTER YA             }
          $0430, {CYRILLIC SMALL LETTER A                }
          $0431, {CYRILLIC SMALL LETTER BE               }
          $0432, {CYRILLIC SMALL LETTER VE               }
          $0433, {CYRILLIC SMALL LETTER GHE              }
          $0434, {CYRILLIC SMALL LETTER DE               }
          $0435, {CYRILLIC SMALL LETTER IE               }
          $0436, {CYRILLIC SMALL LETTER ZHE              }
          $0437, {CYRILLIC SMALL LETTER ZE               }
          $0438, {CYRILLIC SMALL LETTER I                }
          $0439, {CYRILLIC SMALL LETTER SHORT I          }
          $043A, {CYRILLIC SMALL LETTER KA               }
          $043B, {CYRILLIC SMALL LETTER EL               }
          $043C, {CYRILLIC SMALL LETTER EM               }
          $043D, {CYRILLIC SMALL LETTER EN               }
          $043E, {CYRILLIC SMALL LETTER O                }
          $043F, {CYRILLIC SMALL LETTER PE               }
          $0440, {CYRILLIC SMALL LETTER ER               }
          $0441, {CYRILLIC SMALL LETTER ES               }
          $0442, {CYRILLIC SMALL LETTER TE               }
          $0443, {CYRILLIC SMALL LETTER U                }
          $0444, {CYRILLIC SMALL LETTER EF               }
          $0445, {CYRILLIC SMALL LETTER HA               }
          $0446, {CYRILLIC SMALL LETTER TSE              }
          $0447, {CYRILLIC SMALL LETTER CHE              }
          $0448, {CYRILLIC SMALL LETTER SHA              }
          $0449, {CYRILLIC SMALL LETTER SHCHA            }
          $044A, {CYRILLIC SMALL LETTER HARD SIGN        }
          $044B, {CYRILLIC SMALL LETTER YERU             }
          $044C, {CYRILLIC SMALL LETTER SOFT SIGN        }
          $044D, {CYRILLIC SMALL LETTER E                }
          $044E, {CYRILLIC SMALL LETTER YU               }
          $044F) ; {CYRILLIC SMALL LETTER YA               }


procedure WinToUnicode(const S : string ; Result : PUnicodeArray) ;  {отображение win1251 в Unicode}
var
    I : word ;     {счетчик символов}
begin
fillchar(Result^,sizeof(Result^),0) ;
Result^[0] := I ;
for I := 1 to length(S) do Result^[I] := UnicodeWinConvertTable[byte(S[I])] ;
end ;

Для работы с OEM 866 нужно подставить следующую таблицу
Код: Выделить всё
00 = U+0000 : NULL
01 = U+0001 : START OF HEADING
02 = U+0002 : START OF TEXT
03 = U+0003 : END OF TEXT
04 = U+0004 : END OF TRANSMISSION
05 = U+0005 : ENQUIRY
06 = U+0006 : ACKNOWLEDGE
07 = U+0007 : BELL
08 = U+0008 : BACKSPACE
09 = U+0009 : HORIZONTAL TABULATION
0A = U+000A : LINE FEED
0B = U+000B : VERTICAL TABULATION
0C = U+000C : FORM FEED
0D = U+000D : CARRIAGE RETURN
0E = U+000E : SHIFT OUT
0F = U+000F : SHIFT IN
10 = U+0010 : DATA LINK ESCAPE
11 = U+0011 : DEVICE CONTROL ONE
12 = U+0012 : DEVICE CONTROL TWO
13 = U+0013 : DEVICE CONTROL THREE
14 = U+0014 : DEVICE CONTROL FOUR
15 = U+0015 : NEGATIVE ACKNOWLEDGE
16 = U+0016 : SYNCHRONOUS IDLE
17 = U+0017 : END OF TRANSMISSION BLOCK
18 = U+0018 : CANCEL
19 = U+0019 : END OF MEDIUM
1A = U+001A : SUBSTITUTE
1B = U+001B : ESCAPE
1C = U+001C : FILE SEPARATOR
1D = U+001D : GROUP SEPARATOR
1E = U+001E : RECORD SEPARATOR
1F = U+001F : UNIT SEPARATOR
20 = U+0020 : SPACE
21 = U+0021 : EXCLAMATION MARK
22 = U+0022 : QUOTATION MARK
23 = U+0023 : NUMBER SIGN
24 = U+0024 : DOLLAR SIGN
25 = U+0025 : PERCENT SIGN
26 = U+0026 : AMPERSAND
27 = U+0027 : APOSTROPHE
28 = U+0028 : LEFT PARENTHESIS
29 = U+0029 : RIGHT PARENTHESIS
2A = U+002A : ASTERISK
2B = U+002B : PLUS SIGN
2C = U+002C : COMMA
2D = U+002D : HYPHEN-MINUS
2E = U+002E : FULL STOP
2F = U+002F : SOLIDUS
30 = U+0030 : DIGIT ZERO
31 = U+0031 : DIGIT ONE
32 = U+0032 : DIGIT TWO
33 = U+0033 : DIGIT THREE
34 = U+0034 : DIGIT FOUR
35 = U+0035 : DIGIT FIVE
36 = U+0036 : DIGIT SIX
37 = U+0037 : DIGIT SEVEN
38 = U+0038 : DIGIT EIGHT
39 = U+0039 : DIGIT NINE
3A = U+003A : COLON
3B = U+003B : SEMICOLON
3C = U+003C : LESS-THAN SIGN
3D = U+003D : EQUALS SIGN
3E = U+003E : GREATER-THAN SIGN
3F = U+003F : QUESTION MARK
40 = U+0040 : COMMERCIAL AT
41 = U+0041 : LATIN CAPITAL LETTER A
42 = U+0042 : LATIN CAPITAL LETTER B
43 = U+0043 : LATIN CAPITAL LETTER C
44 = U+0044 : LATIN CAPITAL LETTER D
45 = U+0045 : LATIN CAPITAL LETTER E
46 = U+0046 : LATIN CAPITAL LETTER F
47 = U+0047 : LATIN CAPITAL LETTER G
48 = U+0048 : LATIN CAPITAL LETTER H
49 = U+0049 : LATIN CAPITAL LETTER I
4A = U+004A : LATIN CAPITAL LETTER J
4B = U+004B : LATIN CAPITAL LETTER K
4C = U+004C : LATIN CAPITAL LETTER L
4D = U+004D : LATIN CAPITAL LETTER M
4E = U+004E : LATIN CAPITAL LETTER N
4F = U+004F : LATIN CAPITAL LETTER O
50 = U+0050 : LATIN CAPITAL LETTER P
51 = U+0051 : LATIN CAPITAL LETTER Q
52 = U+0052 : LATIN CAPITAL LETTER R
53 = U+0053 : LATIN CAPITAL LETTER S
54 = U+0054 : LATIN CAPITAL LETTER T
55 = U+0055 : LATIN CAPITAL LETTER U
56 = U+0056 : LATIN CAPITAL LETTER V
57 = U+0057 : LATIN CAPITAL LETTER W
58 = U+0058 : LATIN CAPITAL LETTER X
59 = U+0059 : LATIN CAPITAL LETTER Y
5A = U+005A : LATIN CAPITAL LETTER Z
5B = U+005B : LEFT SQUARE BRACKET
5C = U+005C : REVERSE SOLIDUS
5D = U+005D : RIGHT SQUARE BRACKET
5E = U+005E : CIRCUMFLEX ACCENT
5F = U+005F : LOW LINE
60 = U+0060 : GRAVE ACCENT
61 = U+0061 : LATIN SMALL LETTER A
62 = U+0062 : LATIN SMALL LETTER B
63 = U+0063 : LATIN SMALL LETTER C
64 = U+0064 : LATIN SMALL LETTER D
65 = U+0065 : LATIN SMALL LETTER E
66 = U+0066 : LATIN SMALL LETTER F
67 = U+0067 : LATIN SMALL LETTER G
68 = U+0068 : LATIN SMALL LETTER H
69 = U+0069 : LATIN SMALL LETTER I
6A = U+006A : LATIN SMALL LETTER J
6B = U+006B : LATIN SMALL LETTER K
6C = U+006C : LATIN SMALL LETTER L
6D = U+006D : LATIN SMALL LETTER M
6E = U+006E : LATIN SMALL LETTER N
6F = U+006F : LATIN SMALL LETTER O
70 = U+0070 : LATIN SMALL LETTER P
71 = U+0071 : LATIN SMALL LETTER Q
72 = U+0072 : LATIN SMALL LETTER R
73 = U+0073 : LATIN SMALL LETTER S
74 = U+0074 : LATIN SMALL LETTER T
75 = U+0075 : LATIN SMALL LETTER U
76 = U+0076 : LATIN SMALL LETTER V
77 = U+0077 : LATIN SMALL LETTER W
78 = U+0078 : LATIN SMALL LETTER X
79 = U+0079 : LATIN SMALL LETTER Y
7A = U+007A : LATIN SMALL LETTER Z
7B = U+007B : LEFT CURLY BRACKET
7C = U+007C : VERTICAL LINE
7D = U+007D : RIGHT CURLY BRACKET
7E = U+007E : TILDE
7F = U+007F : DELETE
80 = U+0410 : CYRILLIC CAPITAL LETTER A
81 = U+0411 : CYRILLIC CAPITAL LETTER BE
82 = U+0412 : CYRILLIC CAPITAL LETTER VE
83 = U+0413 : CYRILLIC CAPITAL LETTER GHE
84 = U+0414 : CYRILLIC CAPITAL LETTER DE
85 = U+0415 : CYRILLIC CAPITAL LETTER IE
86 = U+0416 : CYRILLIC CAPITAL LETTER ZHE
87 = U+0417 : CYRILLIC CAPITAL LETTER ZE
88 = U+0418 : CYRILLIC CAPITAL LETTER I
89 = U+0419 : CYRILLIC CAPITAL LETTER SHORT I
8A = U+041A : CYRILLIC CAPITAL LETTER KA
8B = U+041B : CYRILLIC CAPITAL LETTER EL
8C = U+041C : CYRILLIC CAPITAL LETTER EM
8D = U+041D : CYRILLIC CAPITAL LETTER EN
8E = U+041E : CYRILLIC CAPITAL LETTER O
8F = U+041F : CYRILLIC CAPITAL LETTER PE
90 = U+0420 : CYRILLIC CAPITAL LETTER ER
91 = U+0421 : CYRILLIC CAPITAL LETTER ES
92 = U+0422 : CYRILLIC CAPITAL LETTER TE
93 = U+0423 : CYRILLIC CAPITAL LETTER U
94 = U+0424 : CYRILLIC CAPITAL LETTER EF
95 = U+0425 : CYRILLIC CAPITAL LETTER HA
96 = U+0426 : CYRILLIC CAPITAL LETTER TSE
97 = U+0427 : CYRILLIC CAPITAL LETTER CHE
98 = U+0428 : CYRILLIC CAPITAL LETTER SHA
99 = U+0429 : CYRILLIC CAPITAL LETTER SHCHA
9A = U+042A : CYRILLIC CAPITAL LETTER HARD SIGN
9B = U+042B : CYRILLIC CAPITAL LETTER YERU
9C = U+042C : CYRILLIC CAPITAL LETTER SOFT SIGN
9D = U+042D : CYRILLIC CAPITAL LETTER E
9E = U+042E : CYRILLIC CAPITAL LETTER YU
9F = U+042F : CYRILLIC CAPITAL LETTER YA
A0 = U+0430 : CYRILLIC SMALL LETTER A
A1 = U+0431 : CYRILLIC SMALL LETTER BE
A2 = U+0432 : CYRILLIC SMALL LETTER VE
A3 = U+0433 : CYRILLIC SMALL LETTER GHE
A4 = U+0434 : CYRILLIC SMALL LETTER DE
A5 = U+0435 : CYRILLIC SMALL LETTER IE
A6 = U+0436 : CYRILLIC SMALL LETTER ZHE
A7 = U+0437 : CYRILLIC SMALL LETTER ZE
A8 = U+0438 : CYRILLIC SMALL LETTER I
A9 = U+0439 : CYRILLIC SMALL LETTER SHORT I
AA = U+043A : CYRILLIC SMALL LETTER KA
AB = U+043B : CYRILLIC SMALL LETTER EL
AC = U+043C : CYRILLIC SMALL LETTER EM
AD = U+043D : CYRILLIC SMALL LETTER EN
AE = U+043E : CYRILLIC SMALL LETTER O
AF = U+043F : CYRILLIC SMALL LETTER PE
B0 = U+2591 : LIGHT SHADE
B1 = U+2592 : MEDIUM SHADE
B2 = U+2593 : DARK SHADE
B3 = U+2502 : BOX DRAWINGS LIGHT VERTICAL
B4 = U+2524 : BOX DRAWINGS LIGHT VERTICAL AND LEFT
B5 = U+2561 : BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
B6 = U+2562 : BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
B7 = U+2556 : BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
B8 = U+2555 : BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
B9 = U+2563 : BOX DRAWINGS DOUBLE VERTICAL AND LEFT
BA = U+2551 : BOX DRAWINGS DOUBLE VERTICAL
BB = U+2557 : BOX DRAWINGS DOUBLE DOWN AND LEFT
BC = U+255D : BOX DRAWINGS DOUBLE UP AND LEFT
BD = U+255C : BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
BE = U+255B : BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
BF = U+2510 : BOX DRAWINGS LIGHT DOWN AND LEFT
C0 = U+2514 : BOX DRAWINGS LIGHT UP AND RIGHT
C1 = U+2534 : BOX DRAWINGS LIGHT UP AND HORIZONTAL
C2 = U+252C : BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
C3 = U+251C : BOX DRAWINGS LIGHT VERTICAL AND RIGHT
C4 = U+2500 : BOX DRAWINGS LIGHT HORIZONTAL
C5 = U+253C : BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
C6 = U+255E : BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
C7 = U+255F : BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
C8 = U+255A : BOX DRAWINGS DOUBLE UP AND RIGHT
C9 = U+2554 : BOX DRAWINGS DOUBLE DOWN AND RIGHT
CA = U+2569 : BOX DRAWINGS DOUBLE UP AND HORIZONTAL
CB = U+2566 : BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
CC = U+2560 : BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
CD = U+2550 : BOX DRAWINGS DOUBLE HORIZONTAL
CE = U+256C : BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
CF = U+2567 : BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
D0 = U+2568 : BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
D1 = U+2564 : BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
D2 = U+2565 : BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
D3 = U+2559 : BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
D4 = U+2558 : BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
D5 = U+2552 : BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
D6 = U+2553 : BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
D7 = U+256B : BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
D8 = U+256A : BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
D9 = U+2518 : BOX DRAWINGS LIGHT UP AND LEFT
DA = U+250C : BOX DRAWINGS LIGHT DOWN AND RIGHT
DB = U+2588 : FULL BLOCK
DC = U+2584 : LOWER HALF BLOCK
DD = U+258C : LEFT HALF BLOCK
DE = U+2590 : RIGHT HALF BLOCK
DF = U+2580 : UPPER HALF BLOCK
E0 = U+0440 : CYRILLIC SMALL LETTER ER
E1 = U+0441 : CYRILLIC SMALL LETTER ES
E2 = U+0442 : CYRILLIC SMALL LETTER TE
E3 = U+0443 : CYRILLIC SMALL LETTER U
E4 = U+0444 : CYRILLIC SMALL LETTER EF
E5 = U+0445 : CYRILLIC SMALL LETTER HA
E6 = U+0446 : CYRILLIC SMALL LETTER TSE
E7 = U+0447 : CYRILLIC SMALL LETTER CHE
E8 = U+0448 : CYRILLIC SMALL LETTER SHA
E9 = U+0449 : CYRILLIC SMALL LETTER SHCHA
EA = U+044A : CYRILLIC SMALL LETTER HARD SIGN
EB = U+044B : CYRILLIC SMALL LETTER YERU
EC = U+044C : CYRILLIC SMALL LETTER SOFT SIGN
ED = U+044D : CYRILLIC SMALL LETTER E
EE = U+044E : CYRILLIC SMALL LETTER YU
EF = U+044F : CYRILLIC SMALL LETTER YA
F0 = U+0401 : CYRILLIC CAPITAL LETTER IO
F1 = U+0451 : CYRILLIC SMALL LETTER IO
F2 = U+0404 : CYRILLIC CAPITAL LETTER UKRAINIAN IE
F3 = U+0454 : CYRILLIC SMALL LETTER UKRAINIAN IE
F4 = U+0407 : CYRILLIC CAPITAL LETTER YI
F5 = U+0457 : CYRILLIC SMALL LETTER YI
F6 = U+040E : CYRILLIC CAPITAL LETTER SHORT U
F7 = U+045E : CYRILLIC SMALL LETTER SHORT U
F8 = U+00B0 : DEGREE SIGN
F9 = U+2219 : BULLET OPERATOR
FA = U+00B7 : MIDDLE DOT
FB = U+221A : SQUARE ROOT
FC = U+2116 : NUMERO SIGN
FD = U+00A4 : CURRENCY SIGN
FE = U+25A0 : BLACK SQUARE
FF = U+00A0 : NO-BREAK SPACE
Аватара пользователя
Vlad04
новенький
 
Сообщения: 62
Зарегистрирован: 11.12.2007 21:11:19
Откуда: Караганда. Казахстан

Сообщение VirtUX » 05.02.2008 11:17:32

Ничего не помогает :(
Вывод locale
Код: Выделить всё
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=

Lazarus: 0.9.24
В каталог обмена приходит текстовый файл с кодировкой CP866 с Windows-server. На Linux-client нужно подхватить этот файл и содержимое отобразить в TMemo или TListBox или TEdit. В файле присутствуют спецсимволы - [250], [254] и другие.
Пробовал функции Attid - не помогло - иероглифы.
Куда копать?
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 869
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Сообщение debi12345 » 05.02.2008 11:28:03

Вариант UCS2=widechar ( не UTF8! ) to CP866:

Код: Выделить всё
unit mseucs2toru;
{$ifdef FPC}{$mode objfpc}{$h+}{$endif}

interface

function ucs2to866(const avalue: widechar): char;
function ucs2to866(const avalue: widestring): ansistring;

implementation

const

cp866_2: array[$2550..$256C] of byte = (
  $cd,$ba,$d5,$d6,$c9,$b8,$b7,$bb,$d4,$d3,$c8,$be,$bd,$bc,$c6,
  $c7,$cc,$b5,$b6,$b9,$d1,$d2,$cb,$cf,$d0,$ca,$d8,$d7,$ce
    );

function ucs2to866(const avalue: widechar): char;
var
    i: cardinal;
begin
    i:= cardinal(avalue);

      case i of
  $0..$7f:      result:= char(avalue);
  $A0:          result:= char($ff);
  $A4:          result:= char($fd);
  $B0,$BA:      result:= char($f8);
  $B7:          result:= char($fa);
  $401:         result:= char($f0);
  $404:         result:= char($f2);
  $407:         result:= char($f4);
  $40E:         result:= char($f6);
  $410..$43f:   result:= char(i-$390);
  $440..$44f:   result:= char(i-$360);
  $451:         result:= char($f1);
  $454:         result:= char($f3);
  $457:         result:= char($f5);
  $45E:         result:= char($f7);
  $2116:        result:= char($fc);
  $2219:        result:= char($f9);
  $221A:        result:= char($fb);
  $2500:        result:= char($c4);
  $2502:        result:= char($b3);
  $250C:        result:= char($da);
  $2510:        result:= char($bf);
  $2514:        result:= char($c0);
  $2518:        result:= char($d9);
  $251C:        result:= char($c3);
  $2524:        result:= char($b4);
  $252C:        result:= char($c2);
  $2534:        result:= char($c1);
  $253C:        result:= char($c5);
  $2550..$256C: result:= char(cp866_2[i]);
  $2580:        result:= char($df);
  $2584:        result:= char($dc);
  $2588:        result:= char($db);
  $258C:        result:= char($dd);
  $2590:        result:= char($de);
  $2591:        result:= char($b0);
  $2592:        result:= char($b1);
  $2593:        result:= char($b2);
  $25A0:        result:= char($fe);
else
  result:= char($20);
    end;
end;


function ucs2to866(const avalue: widestring): ansistring;
var
    i,i1: integer;
begin
    i1:= length(avalue);
    setlength(result,i1);
for i:= 1 to i1 do begin
      result[i]:= ucs2to866(avalue[i]);
    end;
end;


end.

Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5638
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение haword » 05.02.2008 12:06:36

Один вопросик, ты в GTK1 пытаешся просмотреть UTF текст? :)
haword
постоялец
 
Сообщения: 287
Зарегистрирован: 02.03.2006 11:34:40

Сообщение VirtUX » 06.02.2008 10:21:03

haword писал(а):Один вопросик, ты в GTK1 пытаешся просмотреть UTF текст? :)
GTK2. KDE 3.5.7. openSuSE 10.3. Kernel - 2.6.22.-13.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 869
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Сообщение Attid » 06.02.2008 11:56:11

VirtUX писал(а):В каталог обмена приходит текстовый файл с кодировкой CP866 с Windows-server. На Linux-client нужно подхватить этот файл и содержимое отобразить в TMemo или TListBox или TEdit. В файле присутствуют спецсимволы - [250], [254] и другие.
Пробовал функции Attid - не помогло - иероглифы.
Куда копать?


ну дык может
Код: Выделить всё
iconv -f CP866 -t UTF-8 -o file file.utf


ну или использовать iconv в своей проге
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2583
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Uniser » 07.02.2008 11:47:19

utf-8 это многобайтная, т.е. символ м.б и один и два и до 6 байт. в отличие от ucs2 (widechar)
В widestring (ucs2) каждый символ по 2 байта, код символа соответствует коду в unicode
utf8 это своего рода обёртка для unicode, одна из реализаций.
Вот куски моего GPL-кода:
здесь преобразование utf8 <--> widestring.

Код: Выделить всё
var  W:widestring;
     U:UtfString; // тот же AnsiString см ниже

  SetLength(W,3);
  W[1] := #$42D; // буква 'Э'
  W[2] := #$445; // буква 'х'
  W[3] := #$43E; // буква 'о'

  U:=Wide2Utf(W); // получаем utf-8 строку

твоя задача прикрутить строку в дос или вин кодировке к widestring по приведенным ВЫШЕ (другими) алгоритмам, а потом легко преобразовать widestring в uft8

// ВНИМАНИЕ! Ниже приводится код под лицензией GPL
Код: Выделить всё

type
    UtfString = AnsiString;
    Unicode = cardinal;
var
  // unknown replaced
  DefChar     : Char     = '?';
  DefWideChar : WideChar = #$FFFD;
  DefUnicode  : Unicode  = $80000000;


Код: Выделить всё
  function IncLen(var   DST:string;PD,LS,PS:Integer;
                  LN:Integer=1;AD:Integer=0):boolean;
  // Увеличить если требуется длину приёмника (пропорционально PS)
  //   PD - текущая позиция в приёмнике
  //   LS - длина строки источника
  //   PS - текущая позиция в источнике   !!! PS<>0
  //   LN  - сколько символов будет добавлено
  //   AD  - добавить в нагрузку

  function LengthUtfChar(const P:PChar):Integer;
  function LengthUnicode(U:Unicode):Integer;
  function Utf2Uni( UC:PChar; L:Integer ):Unicode; overload;
  function Utf2Uni( UC:PChar ):Unicode;            overload;
  function Uni2Utf( UC:PChar; U :Unicode; L:Integer):Integer; overload;// dangerous
  function Uni2Utf( UC:PChar; U :Unicode ):Integer;           overload;// dangerous
  function Utf8(U:Unicode):string;

  function Utf2Wide(const S:UtfString):WideString;
  function Wide2Utf(const S:WideString):UtfString;

Код: Выделить всё

function IncLen(var   DST:string;PD,LS,PS:Integer;
                LN:Integer=1;AD:Integer=0):boolean;
var L:Int64; // не Integer, иначе получите из положительных отрицательные
begin
  L:=PD+LN-1;
  Result:= L>Length(DST);
  if not Result then exit;
  L:=L*LS div PS + AD;
//  if L<Length(DST) then raise // повидимому переполнение
//    Exception.Create('IncLen: попытка установить меньший размер строки');
  SetLength(DST,L);
end;

function LengthUtfChar(const P:PChar):Integer;
begin
  if P^ < #$C0 then Result:=1 else
  if P^ < #$E0 then
    if (byte(P[1]) and $C0) = $80
    then Result:=2 else Result:=1 else
  if P^ < #$F0 then
    if ((byte(P[1]) and $C0) = $80)
    and((byte(P[2]) and $C0) = $80)
    then Result:=3 else Result:=1 else
  if P^ < #$F8 then
    if ((byte(P[1]) and $C0) = $80)
    and((byte(P[2]) and $C0) = $80)
    and((byte(P[3]) and $C0) = $80)
    then Result:=4 else Result:=1 else
  if P^ < #$FC then
    if ((byte(P[1]) and $C0) = $80)
    and((byte(P[2]) and $C0) = $80)
    and((byte(P[3]) and $C0) = $80)
    and((byte(P[4]) and $C0) = $80)
    then Result:=5 else Result:=1 else
  if P^ < #$FE then
    if ((byte(P[1]) and $C0) = $80)
    and((byte(P[2]) and $C0) = $80)
    and((byte(P[3]) and $C0) = $80)
    and((byte(P[4]) and $C0) = $80)
    and((byte(P[5]) and $C0) = $80)
    then Result:=6 else Result:=1 else
  Result:=1;
end;

function LengthUnicode(U:Unicode):Integer;
begin
  {$ifdef PACKUTF8}
  if U < $000000C0 then Result:=1 else
  if U < $00000800 then
  if(U = $000000FE)
  or(U = $000000FF)then Result:=1
                   else Result:=2 else
  {$else  PACKUTF8}
  if U < $00000080 then Result:=1 else
  if U < $00000800 then Result:=2 else
  {$endif PACKUTF8}
  if U < $00010000 then Result:=3 else
  if U < $00200000 then Result:=4 else
  if U < $04000000 then Result:=5 else
  if U < $80000000 then Result:=6 else Result:=0;
end;

function Utf2Uni( UC:PChar; L:Integer ):Unicode;
begin
  case L of
  1 : Result := byte(UC^);
  2 : Result := (byte(UC^  ) and $1F) shl 6
             or (byte(UC[1]) and $3F);
  3 : Result := ((byte(UC^ ) and $0F)  shl 6
             or (byte(UC[1]) and $3F)) shl 6
             or (byte(UC[2]) and $3F);
  4 : Result := (((byte(UC^) and $07)  shl 6
             or (byte(UC[1]) and $3F)) shl 6
             or (byte(UC[2]) and $3F)) shl 6
             or (byte(UC[3]) and $3F);
  5 : Result := ((((byte(UC^)and $03)  shl 6
             or (byte(UC[1]) and $3F)) shl 6
             or (byte(UC[2]) and $3F)) shl 6
             or (byte(UC[3]) and $3F)) shl 6
             or (byte(UC[4]) and $3F);
  6 : Result :=(((((byte(UC^)and $01)  shl 6
             or (byte(UC[1]) and $3F)) shl 6
             or (byte(UC[2]) and $3F)) shl 6
             or (byte(UC[3]) and $3F)) shl 6
             or (byte(UC[4]) and $3F)) shl 6
             or (byte(UC[5]) and $3F);
  else Result:=DefUnicode;
  end;
end;

function Utf2Uni( UC:PChar ):Unicode;
begin
  Result := Utf2Uni( UC, LengthUtfChar(UC));
end;

function Uni2Utf( UC:PChar; U :Unicode; L:Integer):Integer;
// dangerous
var PC:PChar;
begin
  Result := L;
  if Result = 0 then exit;
  L  := Result - 1;
  PC := UC + L;
  while L > 0 do begin
    PC^ := chr( U and $3F or $80);
    U   := U shr 6;
    dec( PC ); dec(L);   
  end;
  case Result of
//1 :  PC^ := chr(U {and $FF} );
  2 :  PC^ := chr(U {and $1F} or $C0);
  3 :  PC^ := chr(U {and $0F} or $E0);
  4 :  PC^ := chr(U {and $07} or $F0);
  5 :  PC^ := chr(U {and $03} or $F8);
  6 :  PC^ := chr(U {and $01} or $FC);
  else PC^ := chr(U {and $FF} );
  end;
end;

function Uni2Utf( UC:PChar; U :Unicode):Integer; // dangerous
begin
  Result := LengthUnicode(U);
  Result := Uni2Utf(UC,U,Result);
end;
 
function Utf8(U:Unicode):string;
var L:Integer;
begin
  L := LengthUnicode(U);
  SetLength(Result,L);
  Uni2Utf(@Result[1],U,L);
end;

function Utf2Wide(const S:UtfString):WideString;
var PC:PChar; I,J,L:Integer; U:Unicode;
begin
  SetLength(Result,Length(S));
  I:=1; J:=0; PC:=@S[1];
  while I<=Length(S) do begin
    L:=LengthUtfChar(PC);
    U:=Utf2Uni(PC,L);
    if (U and $FFFF) <> U then U:=word(DefWideChar);
    inc(J);
    Result[J]:=WideChar(U);
    inc(PC,L);
    inc(I,L);
  end;
  SetLength(Result,J);
end;

function Wide2Utf(const S:WideString):UtfString;
var I,J,L:Integer; PC:PChar; U:Unicode;
begin
  SetLength(Result,Length(S));
  PC:=@Result[1]; J:=1{0};
  for I:=1 to Length(S) do begin
    U:=Unicode(S[1]);
    L:=LengthUnicode(U);
    IncLen(Result,J,Length(S),I,L,6);
    //if J+L>Length(Result) then
    //  SetLength(Result,Length(S)*(J+L) div I + 6);
    Uni2Utf(PC,U,L);
    inc(PC,L);
    inc(J,L);
  end;
  SetLength(Result,J-1{0}); 
end;

Uniser
новенький
 
Сообщения: 46
Зарегистрирован: 13.05.2005 23:13:57
Откуда: Украина, Полтава

Сообщение ViruZ » 07.02.2008 13:09:37

Спасибо! Буду пробовать.
Но есть еще один вопрос: как программно определить текущую локаль (win/lin)?
ViruZ
постоялец
 
Сообщения: 170
Зарегистрирован: 30.05.2005 17:41:12
Откуда: Украина

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 16

Рейтинг@Mail.ru