Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26068
Рейтинг: 2121
#16: 2010-02-03 13:18:17 ЛС | профиль | цитата
Tad писал(а):
Если не трудно - кинь пример кода чтения первых четырёх байт из текстового файла

Файл со строкой инициализации в 4-е байта скинь, если не трудно
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#17: 2010-02-03 13:27:51 ЛС | профиль | цитата
nesco писал(а):
если не трудно
трудно.
Пока с кодировкой
UTF-32BE 0000FEFF
UTF-32LE FFFE0000
не попадались
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26068
Рейтинг: 2121
#18: 2010-02-03 13:28:36 ЛС | профиль | цитата
Tad, мне что, генератор писать под это дело, или как
------------ Дoбавленo в 14.22:
Вот, как-то так
карма: 22

0
файлы: 1read_bom.zip [940B] [291]
Ответов: 16884
Рейтинг: 1239
#19: 2010-02-03 15:06:59 ЛС | профиль | цитата
Tad писал(а):
не получается у меня.
вот в прицепе все кодировки. Попробуй все файлы. С твоей схемой компонент проще не получается.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1test.rar [356B] [302]
Разработчик
Ответов: 26068
Рейтинг: 2121
#20: 2010-02-03 15:47:39 ЛС | профиль | цитата
Tad писал(а):
С твоей схемой компонент проще не получается

Да ничего сложного



Add(MainForm,2953706,203,189)
{
}
Add(InlineCode,1226154,301,231)
{
WorkPoints=#8:ReadData|
EventPoints=#4:ANSI|4:UTF8|7:UTF16BE|7:UTF16LE|7:UTF32BE|7:UTF32LE|6:Result|
DataPoints=#8:FileName|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|25: FileName: THI_Event;|12: Result,|10: ANSI,|10: UTF8,|13: UTF16BE,|13: UTF16LE,|13: UTF32BE,|25: UTF32LE : THI_Event;|53: procedure ReadData(var _Data:TData; Index:word);|0:|5: end;|0:|14:implementation|0:|31:procedure THiAsmClass.ReadData;|3:var|13: fn: string;|14: st: PStream;|14: c: cardinal;|5:begin|36: Fn := ReadString(_Data, FileName);|30: st := NewReadFileStream(Fn);|16: st.read(c, 4);|10: st.free;|59: if c and $00FFFFFF = $00BFBBEF then _hi_onEvent(UTF8, fn)|105: else if (c and $FFFF0000 <> $00000000) and (c and $0000FFFF = $0000FEFF) then _hi_onEvent(UTF16LE, fn) |104: else if (c and $FFFF0000 <> $00000000) and (c and $0000FFFF = $0000FFFE) then _hi_onEvent(UTF16BE, fn)|104: else if (c and $0000FFFF = $00000000) and (c and $FFFF0000 = $FEFF0000) then _hi_onEvent(UTF32BE, fn) |103: else if (c and $FFFF0000 = $00000000) and (c and $0000FFFF = $0000FEFF) then _hi_onEvent(UTF32LE, fn)|30: else _hi_onEvent(ANSI, fn); |27: _hi_onEvent(Result, c); |4:end;|0:|4:end.|
link(ANSI,703364:doWork1,[])
link(UTF8,703364:doWork2,[])
link(UTF16BE,703364:doWork3,[])
link(UTF16LE,703364:doWork4,[])
link(UTF32BE,703364:doWork5,[])
link(UTF32LE,703364:doWork6,[])
link(Result,2181068:doConvert,[])
}
Add(ODialog,10774586,252,231)
{
Filter="*.txt|*.txt"
link(onExecute,1226154:ReadData,[])
}
Add(Button,10009811,203,231)
{
Left=25
Top=30
link(onClick,10774586:doExecute,[])
}
Add(Edit,5668756,462,196)
{
Left=110
Top=30
Width=145
Text=""
}
Add(Convertor,2181068,406,273)
{
Mode=6
Digits=8
link(onResult,13974656:doText,[])
}
Add(StrList,12288541,406,189)
{
Strings=#4:ANSI|4:UTF8|7:UTF16BE|7:UTF16LE|7:UTF32BE|7:UTF32LE|
Point(doGetString)
Point(onGetString)
link(onGetString,5668756:doText,[])
}
Add(ChanelToIndex,703364,350,231)
{
Count=6
link(onIndex,12288541:doGetString,[])
}
Add(Edit,13974656,462,273)
{
Left=110
Top=55
Width=145
Text=""
}

карма: 22

0
Ответов: 16884
Рейтинг: 1239
#21: 2010-02-03 17:04:17 ЛС | профиль | цитата
Ну всё - делай компонент.
Нужен он.
Если будешь делать, то описку исправь:

UTF-32BE  -> 0000FEFF  
UTF-32LE -> FFFE0000

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26068
Рейтинг: 2121
#22: 2010-02-03 17:22:20 ЛС | профиль | цитата
Tad писал(а):
Ну всё - делай компонент

Может сам сделаешь, а Вот тебе исправленный IC



Add(InlineCode,1226154,301,231)
{
WorkPoints=#8:ReadData|
EventPoints=#4:ANSI|4:UTF8|7:UTF16BE|7:UTF16LE|7:UTF32BE|7:UTF32LE|6:Result|
DataPoints=#8:FileName|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|25: FileName: THI_Event;|12: Result,|10: ANSI,|10: UTF8,|13: UTF16BE,|13: UTF16LE,|13: UTF32BE,|25: UTF32LE : THI_Event;|53: procedure ReadData(var _Data:TData; Index:word);|0:|5: end;|0:|14:implementation|0:|31:procedure THiAsmClass.ReadData;|3:var|13: fn: string;|14: st: PStream;|14: c: cardinal;|5:begin|36: Fn := ReadString(_Data, FileName);|30: st := NewReadFileStream(Fn);|16: st.read(c, 4);|10: st.free;|59: if c and $00FFFFFF = $00BFBBEF then _hi_onEvent(UTF8, fn)|105: else if (c and $FFFF0000 <> $00000000) and (c and $0000FFFF = $0000FEFF) then _hi_onEvent(UTF16LE, fn) |104: else if (c and $FFFF0000 <> $00000000) and (c and $0000FFFF = $0000FFFE) then _hi_onEvent(UTF16BE, fn)|104: else if (c and $0000FFFF = $00000000) and (c and $FFFF0000 = $FFFE0000) then _hi_onEvent(UTF32BE, fn) |103: else if (c and $FFFF0000 = $00000000) and (c and $0000FFFF = $0000FEFF) then _hi_onEvent(UTF32LE, fn)|30: else _hi_onEvent(ANSI, fn); |27: _hi_onEvent(Result, c); |4:end;|0:|4:end.|
}

карма: 22

0
Ответов: 16884
Рейтинг: 1239
#23: 2010-02-03 20:15:53 ЛС | профиль | цитата

------------ Дoбавленo в 20.17:
Вот вроде.
------------ Дoбавленo в 20.36:

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1textfiledecision.rar [1.8KB] [253]
Разработчик
Ответов: 26068
Рейтинг: 2121
#24: 2010-02-03 21:48:27 ЛС | профиль | цитата
Tad, я вот подумал -- а на кой черт на выходе имя файла, лучше сделать один выод события с индексом обнарущенной кодировки Да и защита не помешает от файла меньше 4-х байт
------------ Дoбавленo в 21.54:
Как-то вот так


procedure THITextFileDecision._work_doTextFileDecision;
var
fn: string;
st: PStream;
c: cardinal;
cs: integer;
dc, ds: TData;
begin
fn := ReadString(_Data,_data_FileName,_prop_FileName);
dtString(ds, fn);
if FileExists(Fn) then
begin
st := NewReadFileStream(Fn);
if st.size < 4 then exit;
st.read(c, 4);
st.free;
if c and $00FFFFFF = $00BFBBEF then cs := 1 // UTF-8
else if (c and $FFFF0000 <> $00000000) and (c and $0000FFFF = $0000FEFF) then cs := 2 // UTF-16LE
else if (c and $FFFF0000 <> $00000000) and (c and $0000FFFF = $0000FFFE) then cs := 3 // UTF-16BE
else if (c and $FFFF0000 = $00000000) and (c and $0000FFFF = $0000FEFF) then cs := 4 // UTF-32LE
else if (c and $0000FFFF = $00000000) and (c and $FFFF0000 = $FFFE0000) then cs :=5 // UTF-32BE
else cs := 0; // ANSI
dtInteger(dc, cs);
dc.ldata := @ds;
_hi_onEvent(_event_ANSI, dc);
end
else
begin
dtInteger(dc, -1);
dc.ldata := @ds;
_hi_onEvent(_event_onNotFile, dc);
end;
end;
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#25: 2010-02-03 22:22:19 ЛС | профиль | цитата
nesco писал(а):
я вот подумал -- а на кой черт на выходе имя файла
можно и индекс.
Но в любом случае для дальнейшей схемы потребуется именно имя файла. И ставить "дешифратор" как-то...
Простой пример (компонент тот что выложен в первом топике)
Первый фрагмент определяет кодировку и мультик её обрабатывает.

а в мультике набор для обработки строк с разной кодировкой.
мультик
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 2fr1.png [1.7KB] [485], fr2.png [6.8KB] [463]
Разработчик
Ответов: 26068
Рейтинг: 2121
#26: 2010-02-03 22:42:30 ЛС | профиль | цитата
Tad, давай MT-поток (ARG(CodePage, FileName)) засунем, проблема-то в чем
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#27: 2010-02-03 22:46:53 ЛС | профиль | цитата
nesco писал(а):
давай MT-поток (ARG(CodePage, FileName)) засунем, проблема-то в чем
Думал я тоже над этим, но проблема в последующих танцах с бубном, ИМХО.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26068
Рейтинг: 2121
#28: 2010-02-03 22:52:08 ЛС | профиль | цитата
Tad писал(а):
Думал я тоже над этим, но проблема в последующих танцах с бубном

Да никаких, ставишь MT_MultiiData и получаешь, то что надо, а для индекса можно ничего не ставить

Я поправил пример кода, можешь проверить
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#29: 2010-02-03 23:43:20 ЛС | профиль | цитата
nesco писал(а):
ставишь MT_MultiiData и получаешь, то что надо
это и есть танец с бубном.
Ну почему я должен что-то ставить, если могу сразу получить "то что надо" ??????
Допустим есть возможность обработать несколько текстовых файлов - есть ANSI и CharSet для UTF8->ANSI, UNICODE->ANSI.
Имея на выходе полный путь к файлу - спокойно подаю его на нужную цепочку схемы и обрабатываю.
С использованием MT-потока, что я должен сделать - поставить минимум два добавочных компонента, чтобы разнести путь к файлу по разным цепочкам.

Не понимаю я - какая и кому от этого выгода ?
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26068
Рейтинг: 2121
#30: 2010-02-03 23:46:50 ЛС | профиль | цитата
Tad писал(а):
Не понимаю я - какая и кому от этого выгода ?

Выходы. Количество выходов увеличивается (на каждую кодировку свой выход), что не есть хорошо.
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)