Comment lire un fichier unicode (utf-8) / binaire ligne par ligne
Hi programmeurs,
Je veux lire ligne par ligne Unicode (UTF-8) fichier texte créé par le bloc-notes, je ne veux pas afficher la chaîne Unicode dans l'écran, je veux juste lire et comparer les chaînes!.
Ce code lire ANSI fichier ligne par ligne et comparez les chaînes
Ce que je veux
Lire test_ansi.txt ligne par ligne
si la ligne = "b" imprimer "OUI!"
else print "NON!"
read_ansi_line_by_line.c
#include <stdio.h>
int main()
{
char *inname = "test_ansi.txt";
FILE *infile;
char line_buffer[BUFSIZ]; /* BUFSIZ is defined if you include stdio.h */
char line_number;
infile = fopen(inname, "r");
if (!infile) {
printf("\nfile '%s' not found\n", inname);
return 0;
}
printf("\n%s\n\n", inname);
line_number = 0;
while (fgets(line_buffer, sizeof(line_buffer), infile)) {
++line_number;
/* note that the newline is in the buffer */
if (strcmp("b\n", line_buffer) == 0 ){
printf("%d: YES!\n", line_number);
}else{
printf("%d: NO!\n", line_number,line_buffer);
}
}
printf("\n\nTotal: %d\n", line_number);
return 0;
}
test_ansi.txt
a
b
c
Compilation
gcc -o read_ansi_line_by_line read_ansi_line_by_line.c
Sortie
test_ansi.txt
1: NO!
2: YES!
3: NO!
Total: 3
Maintenant j'ai besoin de lire Unicode (UTF-8) fichier créé par le bloc-notes, après plus de 6 mois je n'ai pas trouvé de bon de code/bibliothèque en C peut lire le fichier codé en UTF-8!, je ne sais pas exactement pourquoi, mais je pense que le standard C ne prennent pas en charge Unicode!
Lecture Unicode fichier binaire son OK!, mais le probleme est le fichier binaire la plupart déjà être créés en mode binaire!, que dire si nous voulons lire un Unicode (UTF-8) fichier créé par le bloc-notes, nous avons besoin de le traduire à partir de fichier UTF-8 dans un fichier BINAIRE!
Ce code d'écriture chaîne Unicode dans un fichier binaire, REMARQUE le fichier C est codé en UTF-8 et compilé par GCC
Ce que je veux
Écrire le char Unicode "ب" à test_bin.dat
create_bin.c
#define UNICODE
#ifdef UNICODE
#define _UNICODE
#else
#define _MBCS
#endif
#include <stdio.h>
#include <wchar.h>
int main()
{
/*Data to be stored in file*/
wchar_t line_buffer[BUFSIZ]=L"ب";
/*Opening file for writing in binary mode*/
FILE *infile=fopen("test_bin.dat","wb");
/*Writing data to file*/
fwrite(line_buffer, 1, 13, infile);
/*Closing File*/
fclose(infile);
return 0;
}
Compilation
gcc -o create_bin create_bin.c
Sortie
create test_bin.dat
Maintenant, je veux lire le fichier binaire ligne par ligne et de comparer les!
Ce que je veux
Lire test_bin.dat ligne par ligne
si la ligne = "ب" imprimer "OUI!"
else print "NON!"
read_bin_line_by_line.c
#define UNICODE
#ifdef UNICODE
#define _UNICODE
#else
#define _MBCS
#endif
#include <stdio.h>
#include <wchar.h>
int main()
{
wchar_t *inname = L"test_bin.dat";
FILE *infile;
wchar_t line_buffer[BUFSIZ]; /* BUFSIZ is defined if you include stdio.h */
infile = _wfopen(inname,L"rb");
if (!infile) {
wprintf(L"\nfile '%s' not found\n", inname);
return 0;
}
wprintf(L"\n%s\n\n", inname);
/*Reading data from file into temporary buffer*/
while (fread(line_buffer,1,13,infile)) {
/* note that the newline is in the buffer */
if ( wcscmp ( L"ب" , line_buffer ) == 0 ){
wprintf(L"YES!\n");
}else{
wprintf(L"NO!\n", line_buffer);
}
}
/*Closing File*/
fclose(infile);
return 0;
}
Sortie
test_bin.dat
YES!
LE PROBLÈME
Cette méthode est TRÈS LONGUE! et PAS PUISSANT (je suis débutant en génie logiciel)
Veuillez tout savoir comment lire fichier Unicode ? (je sais que ce n'est pas facile!)
Merci de tout savoir, comment convertir le fichier Unicode dans un fichier Binaire ? (méthode simple)
Merci de tout savoir comment lire fichier Unicode en mode binaire ? (je ne suis pas sûr)
Merci.
source d'informationauteur Freeseif
Vous devez vous connecter pour publier un commentaire.
Une belle propriété de UTF-8, c'est que vous ne pas besoin de décoder afin de les comparer. La commande retournée à partir de strcmp sera le même si vous le décoder premier ou non. Lisez simplement ce que les matières premières octets et exécuter strcmp.
J'ai trouvé une solution à mon problème, et je voudrais faire part de la solution à toute personne intéressée dans la lecture de fichier UTF-8 en C99.
Je sais que je suis mauvais... mais vous n'avez même pas prendre en considération la MOB! La plupart des exemples ici échouera.
EDIT:
D'Ordre d'octet sont quelques octets au début du fichier, qui peut être utilisé pour identifier l'encodage du fichier. Certains éditeurs ajouter, et beaucoup de fois ils ont juste casser des choses dans la fabuleuse moyens (je me souviens de la lutte contre un PHP en-têtes de problèmes pendant plusieurs minutes à cause de ce problème).
Certains RTFM:
http://en.wikipedia.org/wiki/Byte_order_mark
http://blogs.msdn.com/oldnewthing/archive/2004/03/24/95235.aspx
Qu'est-ce que XML de la NOMENCLATURE et comment la détecter?
Dans cet article, de codage et de décodage de routine est écrit et
il est expliqué comment l'unicode est codé:
http://www.codeguru.com/cpp/misc/misc/multi-lingualsupport/article.php/c10451/
Il peut être facilement ajustée à C.
Simplement encoder votre ANSI ou décoder la Chaîne UTF-8 et de faire un octet
comparer
EDIT: Après l'OP dit qu'il est trop difficile de réécrire la fonction de C++
voici un modèle:
Ce qui est nécessaire:
+ Libérer la mémoire allouée (ou attendez la fin du processus ou de l'ignorer)
+ Ajouter les 4 octets les fonctions
+ Me disent que court et de type int n'est pas garanti à 2 et 4 octets de long (je le sais, mais
C est vraiment stupide !) et enfin
+ Trouver quelques autres erreurs
juste pour régler la NOMENCLATURE argument. Voici un fichier de bloc-notes
avec une NOMENCLATURE au début
Personnellement, je ne pense pas qu'il devrait y avoir un BOM (depuis sa un octet de format), mais ce n'est pas le point