Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.07.2012, 17:01
TRESH TRESH вне форума
Прохожий
 
Регистрация: 25.07.2012
Сообщения: 5
Репутация: 10
По умолчанию помощь с юникодом

Парни\девушки приветствую вас...Не обессудте я тут новенький и не знаю куда обратиться...друг написал консольную программу на делфи ,которая 1-переходит до нужной папки 2-определяет имя файла(каждый раз разное но расширение одно) 3-парсит оттуда текст от какого то сочитания символов и до какого то.4-Значение записывает в готовый файл на новую строчку а исходный файл(в папке который) удаляется....Вот ....программа впринципе работает....но только с кодировкой анси а при юникоде наотрез отказывается работать.....помогите или дописать чтобы тхт файл перекодировался в анси или чтобы программа юникод воспринимала ...( писал её любитель и много не знает...Если кто нибудь решит переписать полностью это будет щё лучше....но губу раскатывать не стану....мне достаточно чтобы юникод воспринимать начала)...
Ответить с цитированием
  #2  
Старый 25.07.2012, 17:03
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Пример файла в юникоде дал-бы. И еще не плохо-бы указать в какой версии delphi написана программа.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение:
TRESH (25.07.2012)
  #3  
Старый 25.07.2012, 17:16
TRESH TRESH вне форума
Прохожий
 
Регистрация: 25.07.2012
Сообщения: 5
Репутация: 10
По умолчанию

http://zalil.ru/33608906 вот программа...её не очень просто запустить ...там есть хелп но все таки на писана на борланд делфи 7...кажется (вместо пробела в пути знак минус (-))
Ответить с цитированием
  #4  
Старый 25.07.2012, 17:17
TRESH TRESH вне форума
Прохожий
 
Регистрация: 25.07.2012
Сообщения: 5
Репутация: 10
По умолчанию

а пример файла обычный блокнотовский файл в кодировки юникод ....-не читает...точно такой же файл в анси читает
Ответить с цитированием
  #5  
Старый 25.07.2012, 17:43
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Почитай вот эту статейку, там написано что нужно искать в начале файла для определения его кодировки.
Затем смотришь исходники, например, функции WideCharToString и будет тебе Щастье (с большой буквы "Щ").
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение:
TRESH (25.07.2012)
  #6  
Старый 25.07.2012, 18:47
TRESH TRESH вне форума
Прохожий
 
Регистрация: 25.07.2012
Сообщения: 5
Репутация: 10
По умолчанию

Уважаемый Aristarh Dark ...я ценю вашу помошь и особенно что очень быстро отвечаете...но из статьи я совсем ничего не понял...ну то есть я прочитал 3 раза но совсем совсем не понял...может быть есть кусок програмного кода ,который просто можно вставить в исходник???для вас ,профессионалов это может быть кажется легко и смешно но для меня это темный лес....я бы даже сказал непроходимая чаща...спасибо за понимание ...
Ответить с цитированием
  #7  
Старый 25.07.2012, 23:06
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Куска программы к сожалению нет. Но общий смысл таков:
1. Читаешь первые 4 байта файла.
2. Сравниваешь их с образцами и определяешь кодировку.
3. Перекодируешь файл из кодировки которую определил в 1251.
4. Далее работаешь уже как обычно.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение:
TRESH (25.07.2012)
  #8  
Старый 26.07.2012, 00:00
TRESH TRESH вне форума
Прохожий
 
Регистрация: 25.07.2012
Сообщения: 5
Репутация: 10
Хорошо

Aristarh Dark спасибо за помощь буду думать.получаться или нет не знаю но буду пробовать
Ответить с цитированием
  #9  
Старый 26.07.2012, 00:05
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Когда-то использовал для MP3:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:32.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025