LINUX.ORG.RU

[lazarus] русская кодировка мать ее

 


0

1

Здравствуйте. Как мне открыть русский текстовый файл в ДОС кодировке да и вообще в любой.. при открытии в МЕМО я вижу только квадратики с крестиками, перепробовал кучу кодировок, ни одна русскую не видить, но если русскими буквоми в редакторе писать то русские отображаются, что за таинственная кодировка используется в лазарусе 0.9.29

Ответ на: комментарий от catap

Lazarus это открытый аналог Delphi) Так вроде Lazarus должен уникодные строки поддерживать? А в любой ну ак не получится я бывают разные(с)

pylin ★★★★★
()
Ответ на: комментарий от catap

Не ну вобще это конечно то же вполне вариант, но в Delphi использовались WideChar(String)в Lazarus наверняка должно быть что то похожее. Сам мигрировал на Python поэтому к сожалению только предполагать могу

pylin ★★★★★
()

enconv FILE



will convert file FILE to your locale native encoding.

record ★★★★★
()
Ответ на: комментарий от pozitiffcat

так как же решить проблему? Мне перекодировать сам текстовый файл внешней утилитой не имеет смысла.. мне нужно брать 866 кодировку и перекодировать для вывода на экран в лазарусе в юникоде (или что у него там...), и одновременноо кодировать строку для 1251 для вывода на устройство, в c++ это как раз плюнуть делается, но мне нужно именно на лазарусе, т.к. там как раз плюнуть конструируется польз. интерфейс, да и еще много удобного в сравнении с Qt

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от catap

делал так

function oemtolocal(s:string):string;
var str:string;
    i,j:integer;
    oem:string;
    loc:string;
    ex:boolean;
begin
  oem:='щЎєъхэу°•чї·ЇvтряЁюыфц¤ ўёьшЄ№с¦ггL¦+=++-¦--L-TL¦¦+T-¦¦-+T¦LT-+';
  loc:='йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ';
  str := '';
  for i:=1 to length(s) do begin
      ex:=false;
      for j:=1 to length(oem) do begin
          if s[i] = oem[j] then begin
             str := str + loc[j];
             ex:=true;
             break;
          end;
       end;
      if not ex then str := str + s[i];
  end;
  result := str;
end;

неверно символы находит, вобщем что то не так, хотя в делфи на винде такая конструкция работает

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

открывай файл как байтовый, потом делай перекодировку по следующей таблице (надеюсь, правильно помню, как хексы с паскале задаются):

 $0000, $0001, $0002, $0003, $0004, $0005, $0006, $0007, $0008, $0009, $000A, $000B, $000C, $000D, $000E, $000F,
 $0010, $0011, $0012, $0013, $0014, $0015, $0016, $0017, $0018, $0019, $001A, $001B, $001C, $001D, $001E, $001F,
 $0020, $0021, $0022, $0023, $0024, $0025, $0026, $0027, $0028, $0029, $002A, $002B, $002C, $002D, $002E, $002F,
 $0030, $0031, $0032, $0033, $0034, $0035, $0036, $0037, $0038, $0039, $003A, $003B, $003C, $003D, $003E, $003F,
 $0040, $0041, $0042, $0043, $0044, $0045, $0046, $0047, $0048, $0049, $004A, $004B, $004C, $004D, $004E, $004F,
 $0050, $0051, $0052, $0053, $0054, $0055, $0056, $0057, $0058, $0059, $005A, $005B, $005C, $005D, $005E, $005F,
 $0060, $0061, $0062, $0063, $0064, $0065, $0066, $0067, $0068, $0069, $006A, $006B, $006C, $006D, $006E, $006F,
 $0070, $0071, $0072, $0073, $0074, $0075, $0076, $0077, $0078, $0079, $007A, $007B, $007C, $007D, $007E, $007F,
 $0410, $0411, $0412, $0413, $0414, $0415, $0416, $0417, $0418, $0419, $041A, $041B, $041C, $041D, $041E, $041F,
 $0420, $0421, $0422, $0423, $0424, $0425, $0426, $0427, $0428, $0429, $042A, $042B, $042C, $042D, $042E, $042F,
 $0430, $0431, $0432, $0433, $0434, $0435, $0436, $0437, $0438, $0439, $043A, $043B, $043C, $043D, $043E, $043F,
 $2591, $2592, $2593, $2502, $2524, $2561, $2562, $2556, $2555, $2563, $2551, $2557, $255D, $255C, $255B, $2510,
 $2514, $2534, $252C, $251C, $2500, $253C, $255E, $255F, $255A, $2554, $2569, $2566, $2560, $2550, $256C, $2567,
 $2568, $2564, $2565, $2559, $2558, $2552, $2553, $256B, $256A, $2518, $250C, $2588, $2584, $258C, $2590, $2580,
 $0440, $0441, $0442, $0443, $0444, $0445, $0446, $0447, $0448, $0449, $044A, $044B, $044C, $044D, $044E, $044F,
 $0401, $0451, $0404, $0454, $0407, $0457, $040E, $045E, $00B0, $2219, $00B7, $221A, $207F, $00B2, $25A0, $00A0
потом s += chr(cp866_to_uni), или как там оно в паскале…

arsi ★★★★★
()
Ответ на: комментарий от arsi

разобрался кое в чем, когда я беру символ , он берет фактически 1 байт! Но для преобразования в утф-8 требуется 2 байта следовательно нужно загонять последовательно 2 байта

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat
function oemtolocal(s:string):string;
var str:utf8string;
i,j:integer;
oem:string;
loc:string;
ex:boolean;
begin
oem:='';
oem:=oem+#128;oem:=oem+#129;oem:=oem+#130;oem:=oem+#131;oem:=oem+#132;
oem:=oem+#133;oem:=oem+#134;oem:=oem+#135;oem:=oem+#136;oem:=oem+#137;
oem:=oem+#138;oem:=oem+#139;oem:=oem+#140;oem:=oem+#141;oem:=oem+#142;
oem:=oem+#143;oem:=oem+#144;oem:=oem+#145;oem:=oem+#146;oem:=oem+#147;
oem:=oem+#148;oem:=oem+#149;oem:=oem+#150;oem:=oem+#151;oem:=oem+#152;
oem:=oem+#153;oem:=oem+#154;oem:=oem+#155;oem:=oem+#156;oem:=oem+#157;
oem:=oem+#158;oem:=oem+#159;oem:=oem+#160;oem:=oem+#161;oem:=oem+#162;
oem:=oem+#163;oem:=oem+#164;oem:=oem+#165;oem:=oem+#166;oem:=oem+#167;
oem:=oem+#168;oem:=oem+#169;oem:=oem+#170;oem:=oem+#171;oem:=oem+#172;
oem:=oem+#173;oem:=oem+#174;oem:=oem+#175;oem:=oem+#224;oem:=oem+#225;
oem:=oem+#226;oem:=oem+#227;oem:=oem+#228;oem:=oem+#229;oem:=oem+#230;
oem:=oem+#231;oem:=oem+#232;oem:=oem+#233;oem:=oem+#234;oem:=oem+#235;
oem:=oem+#236;oem:=oem+#237;oem:=oem+#238;oem:=oem+#239;
loc:='АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя';
str := '';
for i:=1 to length(s) do begin
ex:=false;
for j:=1 to length(oem) do begin
if s[i] = oem[j] then begin
str := str + loc[(j-1)*2+1]+loc[(j-1)*2+2]; //брать по 2 байта
ex:=true;
break;
end;
end;
if not ex then str := str + s[i];
end;
result := str;
end; 

это рабочая функция

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

wxwidgets тогда.
не думаю что лазарус настолько жив, чтобы не довелось мучиться с постоянными сложностями, ноги коих растут из малой его популярности.

VladimirMalyk ★★★★★
()
Ответ на: комментарий от VladimirMalyk

Мое мнение что Qt будет по круче во всем чем wxwidgets. Пробовал я это дело. Мне не понравилось.. а последний лазарь 0.9.29 очень даже ничего по сравнению с 0.9.28 багов замечено небыло.

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

профит виксвиджетов в том что они худые. если принять начальный посыл что кьют не устраивает ибо жирен.
лазарь плох тем что он не мейнстрим. в кьюте же навалом передовых вещей, оставлять которые без внимания моветон

VladimirMalyk ★★★★★
()
Ответ на: комментарий от pozitiffcat

>Но для преобразования в утф-8 требуется 2 байта следовательно нужно загонять последовательно 2 байта

::facepalm:: Мне стыдно за подрастающее поколение.

И кроме того, как ты собираешься программы писать если даже свои мысли на РОДНОМ языке связанно выразить не можешь?

Macil ★★★★★
()
Ответ на: комментарий от pozitiffcat

Перемать. Да заюзай же наконец iconv, как это делают все нормальные люди.

Macil ★★★★★
()
Ответ на: комментарий от Macil

Ну ты же все равно меня понял. Это на паскале я вторую неделю сижу, а предыдущие лет 7 писал MSVC C++, ничего стыдного я в этом не вижу.

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от VladimirMalyk

Вы правы. Но как я смотрю лазарь не собирается загибаться и они хотят в начале 2011 выпускать свою «первую» версию, наконец-то))).

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от Love5an

да пожалуйста...
как же человек может поверить, не убедившись в этом

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от Love5an

Мне вот делать дома нехера и я под линуксом извращаюсь пишу дрова для Фискальных Регистраторов для весов CAS и DIGI. Но я же еще совсем пи*дюк, и это совсем не для работы я делаю. И вообще кто 15 летнего малыша возьмет программистом в г. Тольятти.

Так вот поверь.. существуют и 22 летние программисты ;-) даже в таких поганых городах России как Тольятти

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от VladimirMalyk

провел эксперимент, кьют быстрее работает чем программы на лазаре, и оперативы жрет меньше, но скорость запуска приложения раза в 3 выше чем у кьюта

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от VladimirMalyk

Вот это уже интересней, попробую покопаться.

pozitiffcat ★★★
() автор топика
30 августа 2011 г.
Ответ на: комментарий от pozitiffcat

function oemtolocal

Сам недавно начал писать в среде Lazarus. При написании программы для поиска и отображения информации из файла .dbf столкнулся с аналогичной проблемой (квадратики и черточки вместо русских букв), т.к. .dbf-файл с DOS-кодировкой. Пишу для Linux. Предложенный вами вариант помог выйти из данного затруднения, за что вам огромное спасибо. Правда сейчас встал вопрос с обратной перекодировкой при создании выходного файла .dbf с выбранными данными из предыдущего файла. Т.е. теперь надо из массива ввести данные во вновь созданный файл .dbf и чтобы кодировка вновь созданного файла была не UTF-8, а DOS. Иначе ранее написанная программа в вышестоящей организации не примет выходной файл созданный моей программой. Если можно, выложите текст функции обратной перекодировки (типа LocalToOem). К великому сожалению пока не хватает сообразительности сделать такую функцию самому на основе приведенной вами OemToLocal. Возможно существуют и другие способы поменять кодировку, но к сожалению я пока ничего полезного для себя не нашел.

lazonews
()
Ответ на: function oemtolocal от lazonews

о, блин, прошлогодняя тема всплыла...

record ★★★★★
()

>ДОС кодировке

cp866 ЕМНИП

К слову, емнип оо открывал такое без проблем. Или я путаю.

Zhbert ★★★★★
()
Ответ на: function oemtolocal от lazonews

сорри ща помочь ничем не смогу, я щас на c++ и на яве пишу.. думаю стоит поискать utf8 to cp866 под delphi в гугле

pozitiffcat ★★★
() автор топика
Ответ на: function oemtolocal от lazonews

Люди, освойте наконец UTF8Encode и UTF8Decode. Еще CTRL+click на них сделайте и наслаждайтесь списком на все случаи жизни.

AlexCones ★★★
()
Ответ на: комментарий от pozitiffcat

function oemtolocal

Жаль, а вы не смогли бы дать белее подробные комментарии к вашей функции oemtolocal? А именно: - что означает выражение oem:=oem+#128; .... oem:=oem+#239;, точнее что такое #128 ... #239; - (str := str + loc[(j-1)*2+1]+loc[(j-1)*2+2]; //брать по 2 байта) если можно разжуйте для чайника, смысл и суть данного выражения, каким образом берется по 2 байта и как это вообще работает.

Извиняюсь конечно за глупые вопросы, но я действительно начинающий и очень хочу разобраться в том как работает данная функция.

Заранее спасибо

lazonews
()
Ответ на: комментарий от AlexCones

function oemtolocal

Но эта функция относится к языку PHP, если я правильно понял из тех мануалов, что открыл по ссылкам в Гугле. Но если я не прав подскажите как применить данные функции в ЛАЗАРУС.

lazonews
()
Ответ на: function oemtolocal от lazonews

>разжуйте для чайника

#NNN - Код символа. Эта «таблица» наращавает строку oem для последующих действий.

AlexCones ★★★
()
Ответ на: комментарий от AlexCones

т.е. коды #128 ... #239 cp866-кодировки соответствуют этой строке - АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя в UTF-8-кодировке. Я правильно понял? Таким образом и производится подбор символов, который и определяется строкой str := str + loc[(j-1)*2+1]+loc[(j-1)*2+2]; при соблюдении соответствующего условия?

lazonews
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.