2010-07-01 13 views
0

J'utilise cette fonction pour lire le fichier à chaîneRemplacer la chaîne qui contient # 0?

function LoadFile(const FileName: TFileName): string; 
begin 
    with TFileStream.Create(FileName, 
     fmOpenRead or fmShareDenyWrite) do begin 
    try 
     SetLength(Result, Size); 
     Read(Pointer(Result)^, Size); 
    except 
     Result := ''; 
     Free; 
     raise; 
    end; 
    Free; 
    end; 
end; 

Voici le texte du fichier:

version 

Voici la valeur de retour de LoadFile:

'ÿþv'#0'e'#0'r'#0's'#0'i'#0'o'#0'n'#0 

Je veux faire une le nouveau fichier contient "verabc". Le problème est que j'ai toujours un problème pour remplacer "sion" par "abc". J'utilise D2007. Si j'enlève tout # 0 alors le résultat devient un caractère chinois.

Répondre

8

Ce que vous pensez est le texte du fichier n'est pas vraiment le texte du fichier. Ce que vous avez lu dans votre variable chaîne est précis. Vous avez un fichier texte Unicode codé comme little-endian UTF-16. Les deux premiers octets représentent la marque de l'ordre des octets, et chaque paire d'octets après cela est un autre caractère de la chaîne.

Si vous lisez un fichier Unicode, vous devez utiliser un type de données Unicode, tel que WideString. Vous souhaiterez diviser la taille du fichier par deux lors de la définition de la longueur de la chaîne, et vous devrez supprimer les deux premiers octets.

Si vous ne savez pas quel type de fichier vous lisez, vous devez d'abord lire les deux ou trois premiers octets. Si les deux premiers octets sont $ ff $ fe, comme ci-dessus, alors vous pourriez avoir un fichier UTF-16 little-endian; lire le reste du fichier dans un WideString, ou UnicodeString si vous avez ce type. S'ils sont $ fe $ ff, alors ça pourrait être big-endian; lire le reste du fichier dans un WideString, puis échanger l'ordre de chaque paire d'octets. Si les deux premiers octets sont $ ef $ bb, vérifiez le troisième octet. Si c'est $ bf, alors ils sont probablement la marque de l'ordre des octets UTF-8. Rejeter tous les trois et lire le reste du fichier dans un AnsiString ou un tableau d'octets, puis utilisez une fonction comme UTF8Decode pour le convertir en WideString.

Une fois que vous avez vos données dans un WideString, le débogueur indique qu'il contient version, et vous devriez avoir aucun problème en utilisant une version compatible Unicode de StringReplace faire votre remplacement.

+0

Rob, je crée un fichier avec le bloc-notes et le remplit avec "version" puis en utilisant la fonction ci-dessus, j'ai toujours le caractère unicode dans ma variable. Est-ce la règle? J'utilise D2007 & Vista. –

+0

ah désolé, il y a quelques problèmes avec mon éditeur. J'ouvre le fichier avec le bloc-notes et tout se passe bien !! –

+0

Évidemment, l'encodage par défaut dans Vista UTF-16. Il est temps. Si vous avez vraiment besoin d'un encodage différent, utilisez la boîte de dialogue "enregistrer sous" et choisissez quelque chose de différent.Tout se passe bien lorsque vous ouvrez le fichier dans le Bloc-notes, car il utilise la procédure que j'ai décrite dans ma réponse. C'est même un peu plus compliqué que ça, car il prend aussi en compte le codage ANSI. –

0

Il semble que vous chargiez un fichier texte codé Unicode. 0 indique le caractère latin.

Si vous ne souhaitez pas utiliser le texte unicode, choisissez l'encodage ANSI dans votre éditeur lorsque vous enregistrez le fichier.

Si vous avez besoin d'un codage Unicode, utilisez WideCharToString pour le convertir en une chaîne ANSI, ou supprimez simplement le 0 s, bien que ce dernier ne soit pas la meilleure solution. Retirez également les 2 caractères principaux, ÿþ.
L'éditeur a mis ces octets à mark le fichier comme unicode.

+1

0 indique la langue anglaise? Quelle valeur indique le langage Klingon? :) – mjn

+0

@Cosmin, merci, j'ai édité ma réponse. –

+0

0 indique le latin? Si tacuisses ... :) – mjn