Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| |
Конвертор -- хорошо, но... 27.11.03 12:46 Число просмотров: 2761
Автор: LLL <Алексей> Статус: Member
|
как я понял вопрос, надо конвертить базу, а не текст. Тем не менее, если mysql позволяет сделать экспорт-импорт базы через текст, то утилитка вполне может помочь.
Под юниксом для перекодирования текстов сам давно пользуюсь простеньким шелл-скриптом, который когда-то сваял один знакомый. Скрипт содержит таблицы, передаваемые tr'у, который собственно конвертацию и делает. Насчет производительности tr'а ничего сказать не могу, зато скрипт платформенно-независимый.
|
<web building>
|
кодировки БД 26.11.03 23:53
Автор: dron <Ivanov Andrey> Статус: Member
|
Есть большая база данных (4 гига) некоторые таблицы по 10 млн записей, крутится под mssql на 4-м пне 1,3 гигагерца, написал оболочку на asp, пока база была маленькая вспе было нормуль, как только разлослаьс до нынешних размеров выдает odbc еррор типа реквест таймаут хоть убейся, всвязи с этим перенес все под mysql на линухе (2 пень 300 мегагерц) - запрос выполняется не намного дольше, зато никаких там таймаутов, оболочку переписал на php, но возникла проблемка: в mysql я заливал все из тестового файла, который предварительно экпортнул из mssql, а там кодировка 1251. Вот я и думаю ничего если данные так и будут в этой кодировке лежать, или все же лучше в кои-8 конвертнуть и как енто сделать??? Просто неудобно утилиткой линуховской данные просматривать...
|
|
[Delphi] Вот тебе конвертор... 27.11.03 12:31
Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 27.11.03 12:59 Количество правок: 1
|
Subj.
Кодирует Win1251 в КОИ8. По ссылке PE32 файл, поэтому запускать под виндой ;-)
Хочешь, сам разберись, ниже код...
Язык паскаль, компилер Delphi...
Таблицы перекодировки взяты из легендарного Far Manager'а.
Буферизация 64k, лопатит тексты только шуба заворачиватеся, лишь бы винт успевал ;-)
Размер файлов неважен, может быть больше 4 гигов.
Удачи.
program Win1251toKOI8r;
{$APPTYPE CONSOLE}
uses Windows;
Type
TByteArray = Array[0..$FF] Of Byte;
CONST
KOI8_R_MAP: TByteArray = (
$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,$F4,$FE,$F9,$FB,$F7,$F3,$F2,$FF,$F5,$F8,$FD,$FA,$F6,
$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,$FC,
$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
);
Windows_1251_MAP: TByteArray = (
$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,
$3F,$3F,$27,$3F,$22,$3A,$C5,$D8,$3F,$25,$3F,$3C,$3F,$3F,$3F,$3F,
$3F,$27,$27,$22,$22,$07,$2D,$2D,$3F,$54,$3F,$3E,$3F,$3F,$3F,$3F,
$FF,$F6,$F7,$3F,$FD,$3F,$B3,$15,$F0,$63,$F2,$3C,$BF,$2D,$52,$F4,
$F8,$2B,$49,$69,$3F,$E7,$14,$FA,$F1,$FC,$F3,$3E,$3F,$3F,$3F,$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
);
Type
TWorkBuffer = Packed Array[1..1024*64] Of Byte; //64k buffering -veryfast!!!
Var
J: Integer;
NewMap: TByteArray;
rFile, wFile: THandle;
inBuff, outBuff: TWorkBuffer;
BytesReaded, BytesWritten: DWORD;
begin
If ParamCount < 2 Then
Begin
WriteLn('Insufficent command line parameters. Expected: in_file_name, out_file_name');
Exit;
End;
For J := 0 To $FF Do
NewMap[J] := J; //Init convert map
For J := 0 To $FF Do
NewMap[KOI8_R_MAP[J]] := J; //Fill convert map
rFile := CreateFile(PChar(ParamStr(1)), GENERIC_READ, FILE_SHARE_READ, Nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
If rFile = INVALID_HANDLE_VALUE Then
Begin
WriteLn('Error opening input file');
Exit;
End;
Try
wFile := CreateFile(PChar(ParamStr(2)), GENERIC_WRITE, 0, Nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
If wFile = INVALID_HANDLE_VALUE Then
Begin
WriteLn('Error opening output file');
Exit;
End;
Try
BytesReaded := 0; BytesWritten := 0;
Repeat
If Not ReadFile(rFile, inBuff, SizeOf(inBuff), BytesReaded, Nil) Then
Begin
WriteLn('Error reading input file');
Exit;
End;
For J := 1 To BytesReaded Do //Real conversion goes here
outBuff[J] := NewMap[Windows_1251_MAP[inBuff[J]]];
If Not WriteFile(wFile, outBuff, BytesReaded, BytesWritten, Nil) Then
Begin
WriteLn('Error writing output file');
Exit;
End;
Until SizeOf(inBuff) <> BytesReaded;
Finally
CloseHandle(wFile);
End;
Finally
CloseHandle(rFile);
End;
end. ---
Бинарник можно взять здесь:
|
| |
Конвертор -- хорошо, но... 27.11.03 12:46
Автор: LLL <Алексей> Статус: Member
|
как я понял вопрос, надо конвертить базу, а не текст. Тем не менее, если mysql позволяет сделать экспорт-импорт базы через текст, то утилитка вполне может помочь.
Под юниксом для перекодирования текстов сам давно пользуюсь простеньким шелл-скриптом, который когда-то сваял один знакомый. Скрипт содержит таблицы, передаваемые tr'у, который собственно конвертацию и делает. Насчет производительности tr'а ничего сказать не могу, зато скрипт платформенно-независимый.
|
| | |
А я конверчу trans-ом 27.11.03 16:59
Автор: amirul <Serge> Статус: The Elderman
|
Из латехового пакета (tetex-latex.bla-bla-bla.rpm) там тоже tr используется, но понимает штук 5 кодировок и конвертит из любой в любую. Производительность хорошая. Потому как тормоза могут идти только от шелла, но непосредственно конвертация производится уже в бинарном tr - очень неплохо справляющимся со своими обязанностями.
|
| | | |
Спасибо! но стоит ли заморачиваться?? 01.12.03 21:23
Автор: dron <Ivanov Andrey> Статус: Member
|
Мож оставить все как есть, пускай себе валяются в 1251, в браузере они же выдаются в нормальном виде, или можно наткнуться на какие-нить грабли??? Просто уже надоело писать -), сначала на asp теперь вот на php, хочется уже прикрутить и забыть, хотя бы на время!
|
| | | | |
Тогда надо mysql сказать, что данные в 1251 лежат... чтоб... 02.12.03 13:51
Автор: archy Статус: Незарегистрированный пользователь
|
> Мож оставить все как есть, пускай себе валяются в 1251, в > браузере они же выдаются в нормальном виде, или можно > наткнуться на какие-нить грабли??? Просто уже надоело > писать -), сначала на asp теперь вот на php, хочется уже > прикрутить и забыть, хотя бы на время! Тогда надо mysql сказать, что данные в 1251 лежат... чтоб сортировки всякие были и все такое...
|
| | | | | |
а как?? 03.12.03 11:35
Автор: dron <Ivanov Andrey> Статус: Member
|
А иде ему енто указать можно?
|
| | |
Пусть возьмёт таблицы из FAR'a и напишет собственную процедуру (для MySQL или Perl или для чего ему надо), я думаю в моём примере всё понятно. Да и WEB рулит, я думаю есть куча примеров готовых скриптов. 27.11.03 12:56
Автор: HandleX <Александр М.> Статус: The Elderman
|
|
|
|