|
#1
|
|||
|
|||
помощь с юникодом
Парни\девушки приветствую вас...Не обессудте я тут новенький и не знаю куда обратиться...друг написал консольную программу на делфи ,которая 1-переходит до нужной папки 2-определяет имя файла(каждый раз разное но расширение одно) 3-парсит оттуда текст от какого то сочитания символов и до какого то.4-Значение записывает в готовый файл на новую строчку а исходный файл(в папке который) удаляется....Вот ....программа впринципе работает....но только с кодировкой анси а при юникоде наотрез отказывается работать.....помогите или дописать чтобы тхт файл перекодировался в анси или чтобы программа юникод воспринимала ...( писал её любитель и много не знает...Если кто нибудь решит переписать полностью это будет щё лучше....но губу раскатывать не стану....мне достаточно чтобы юникод воспринимать начала)...
|
#2
|
||||
|
||||
Пример файла в юникоде дал-бы. И еще не плохо-бы указать в какой версии delphi написана программа.
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение: | ||
TRESH (25.07.2012)
|
#3
|
|||
|
|||
http://zalil.ru/33608906 вот программа...её не очень просто запустить ...там есть хелп но все таки на писана на борланд делфи 7...кажется (вместо пробела в пути знак минус (-))
|
#4
|
|||
|
|||
а пример файла обычный блокнотовский файл в кодировки юникод ....-не читает...точно такой же файл в анси читает
|
#5
|
||||
|
||||
Почитай вот эту статейку, там написано что нужно искать в начале файла для определения его кодировки.
Затем смотришь исходники, например, функции WideCharToString и будет тебе Щастье (с большой буквы "Щ"). Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение: | ||
TRESH (25.07.2012)
|
#6
|
|||
|
|||
Уважаемый Aristarh Dark ...я ценю вашу помошь и особенно что очень быстро отвечаете...но из статьи я совсем ничего не понял...ну то есть я прочитал 3 раза но совсем совсем не понял...может быть есть кусок програмного кода ,который просто можно вставить в исходник???для вас ,профессионалов это может быть кажется легко и смешно но для меня это темный лес....я бы даже сказал непроходимая чаща...спасибо за понимание ...
|
#7
|
||||
|
||||
Куска программы к сожалению нет. Но общий смысл таков:
1. Читаешь первые 4 байта файла. 2. Сравниваешь их с образцами и определяешь кодировку. 3. Перекодируешь файл из кодировки которую определил в 1251. 4. Далее работаешь уже как обычно. Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение: | ||
TRESH (25.07.2012)
|
#8
|
|||
|
|||
Aristarh Dark спасибо за помощь буду думать.получаться или нет не знаю но буду пробовать
|
#9
|
||||
|
||||
Когда-то использовал для MP3:
Код:
unit convert; interface const UTF16BE = $FFFE; UTF16LE = $FEFF; function DetectUTF16LEBOM(const P: PChar; const Size: Integer): Boolean; function DetectUTF16BEBOM(const P: PChar; const Size: Integer): Boolean; function UTF16ToUTF8(const S : WideString; Count : Integer; var utf : Boolean; Swap : Boolean = False) : AnsiString; implementation //---------------------------------------------------------- type UCS2 = Word; UCS4 = Cardinal; const MaximumUCS4 : UCS4 = $7FFFFFFF; ReplacementCharacter : UCS4 = $0000FFFD; function DetectUTF16LEBOM(const P: PChar; const Size: Integer): Boolean; begin Result := Assigned(P) and (Size >= Sizeof(WideChar)) and (PWideChar(P)^ = WideChar(UTF16LE)); end; function DetectUTF16BEBOM(const P: PChar; const Size: Integer): Boolean; begin Result := Assigned(P) and (Size >= Sizeof(WideChar)) and (PWideChar(P)^ = WideChar(UTF16BE)); end; function SwapUTF16Endian(const P : Cardinal) : Cardinal; begin Result := ((Ord(P) and $FF) shl 8) or (Ord(P) shr 8); end; function ConvertSurrogate(S1, S2 : UCS2) : UCS4; // Converts a pair of high and low surrogate into the corresponding UCS4 character. const SurrogateOffset = ($D800 shl 10) + $DC00 - $10000; begin Result := Word(S1) shl 10 + Word(S2) - SurrogateOffset; end; function UTF16ToUTF8(const S : WideString; Count : Integer; var utf : Boolean; Swap : Boolean = False) : AnsiString; // Converts the given Unicode text (which may contain surrogates) into // the UTF-8 encoding used for the HTML clipboard format. const FirstByteMark: array[0..6] of Byte = ($00, $00, $C0, $E0, $F0, $F8, $FC); var Ch : UCS4; I, J, T : Integer; BytesToWrite : Cardinal; begin Result := ''; utf := True; if (Count = 0) then Exit; begin // Make room for the result. Assume worst case, there are only short texts to convert. SetLength(Result, 6 * Count); T := 1; I := 1; BytesToWrite := 0; while I <= Count do begin Ch := UCS4(S[i]); if Swap then // for UTF16BE Ch := SwapUTF16Endian(Ch); if (Hi(Ch) = 0) and (Lo(Ch) >= $C0) then // for wild (mad) record with codepage cp1251 begin BytesToWrite := 1; Result[T] := AnsiChar(Lo(Ch)); inc(T, BytesToWrite); inc(I); utf := False; Continue; end else begin if (Ch and $FFFFF800) = $D800 then // Is the character a surrogate? begin inc(I); // Check the following char whether it forms a valid surrogate pair with the first character. if (I <= Count) and ((UCS4(S[i]) and $FFFFFC00) = $DC00) then Ch := ConvertSurrogate(UCS2(Ch), UCS2(S[i])) else // Skip invalid surrogate value. Continue; end; if Ch < $80 then BytesToWrite := 1 else if Ch < $800 then BytesToWrite := 2 else if Ch < $10000 then BytesToWrite := 3 else if Ch < $200000 then BytesToWrite := 4 else if Ch < $4000000 then BytesToWrite := 5 else if Ch <= MaximumUCS4 then BytesToWrite := 6 else begin BytesToWrite := 2; Ch := ReplacementCharacter; end; end; for J := BytesToWrite downto 2 do begin Result[T + J - 1] := AnsiChar((Ch or $80) and $BF); Ch := Ch shr 6; end; Result[T] := AnsiChar(Ch or FirstByteMark[BytesToWrite]); inc(T, BytesToWrite); inc(I); end; SetLength(Result, T - 1); // set to actual length end; end; end. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
TRESH (26.07.2012)
|