Zmiana kodowania za pomocą iconv

dział ogólny

Zmiana kodowania za pomocą iconv

Nowy postprzez Darek_C++ » środa, 16 czerwca 2010, 18:01

Witam ponownie,
do przekodowania tekstów np z iso-8859-2 na utf-8 w PHP wykorzystuje się bibliotekę iconv w necie poszukałem bibliotekę iconv.dll pod windows. Biblioteka iconv.lib dołączana była od VC wiec skonwertowałem programem coff2omf.exe i program da się skompilować, ale nie da się uruchomić funkcji przekodowania z powodu błędu :
"First chance exception at $7C812AFB. Exception class EAccessViolation with message 'Access violation at address 1000E2F8 in module 'ICONV.DLL'. Read of address FFFFFFFF'. Process ProjectIconv.exe (2200)"

Nie wiem czy jest to błąd spowodowany w samej bibliotece DLL czy powstał na skutek złego przekazania parametrów tych wskaźników do wskaźnika char ** do funkcji z biblioteki DLL
Kod: Zaznacz cały
#define MYBUFSZ 1024
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   iconv_t ic;
   ic = iconv_open("8859-2", "UTF-8");

   char str_in[MYBUFSZ+1];
   char str_out[MYBUFSZ+1];
   const char *ptr_in = str_in;
   char *ptr_out = str_out;
   size_t ilen,olen;

   strcpy(str_in, "¶±ę漡żĘ¦Ć");

   ilen = strlen(str_in) + 1;
   olen = sizeof(str_out);

   // Tak wyglada deklaracja funkcji w iconv.h
       //size_t  iconv(ic, char **, size_t *, char **, size_t *);
   iconv(ic, &ptr_in, &ilen, &ptr_out, &olen);  // <<<<<<<<< TUTAJ WYWALA BLAD
   iconv_close(ic);
}
W załączniku zamieściłem źródła programu. Kod programu pochodził z tej strony http://www.slogical.co.jp/tech/unixc_iconv.html

Może ktoś z Was korzysta z iconv i podzieli się informacja jak to zrobić w BCB.
----
Tutaj jest też biblitela DLL i LIB do pobrania http://www.zlatkovic.com/pub/libxml/ico ... .win32.zip
Pozdrawiam
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Zmiana kodowania za pomocą iconv

Nowy postprzez polymorphism » środa, 16 czerwca 2010, 21:16

Samo wywołanie funkcji wygląda ok, jedyne co budzi obawę to to, że nie sprawdzasz czy iconv_open zwraca poprawną wartość - zawsze sprawdzaj co tego typu funkcje zwracają. Co do samego iconv.lib, zamiast konwertować spróbuj wygenerować własny implib'em - w sieci znajdziesz co i jak.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Zmiana kodowania za pomocą iconv

Nowy postprzez Cyfrowy Baron » czwartek, 17 czerwca 2010, 07:37

W celu wygenerowania biblioteki LIB w oparciu o bibliotekę DLL można posłużyć się programem implib.exe wchodzącym w skład środowiska:

W linii komend (konsola CMD) należy wpisać:


implib iconv.lib iconv.dll



Trzeba oczywiście wejść do katalogu w którym znajduje się biblioteka DLL.

implib.png
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Zmiana kodowania za pomocą iconv

Nowy postprzez Darek_C++ » czwartek, 17 czerwca 2010, 13:49

Wygenerowałem, dodałem do projektu, ale pojawia się błąd:
[Linker Error] Error: Unresolved external '_libiconv_open' referenced from C:\DOCUMENTS AND SETTINGS\GAJOWY\MOJE DOKUMENTY\BORLAND STUDIO PROJECTS\MOJE\TESTICONV\TESTICONV\DEBUG_BUILD\UNIT1.OBJ

Zastanawiam się jak inni korzystają z tego skoro są takie problemy :(
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Zmiana kodowania za pomocą iconv

Nowy postprzez polymorphism » czwartek, 17 czerwca 2010, 13:55

Pozbądź się tego '_' przed nazwą, chyba w opcjach implib'a da się to ustawić.

Zastanawiam się jak inni korzystają z tego skoro są takie problemy

Piszą w (jedynie słusznym :P) VC, ewentualnie kompilują bibliotekę na własnym kompilatorze, co nie jest wcale rzadką praktyką.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Zmiana kodowania za pomocą iconv

Nowy postprzez Darek_C++ » czwartek, 17 czerwca 2010, 14:07

@Pozbądź się tego '_' przed nazwą, chyba w opcjach implib'a da się to ustawić.
Tylko jak ma się tego pozbyć ?
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Zmiana kodowania za pomocą iconv

Nowy postprzez polymorphism » czwartek, 17 czerwca 2010, 14:36

Przecież napisałem jak. Poszukaj w opcjach implib'a, czy nie ma jakiegoś przełącznika, który wyłączy to dodawanie '_' przed nazwą każdej funkcji. Ja Tobie nie powiem nazwy tego przełącznika, bo nie mam ani implib'a, ani dokumentacji do niego. Niech się wypowie ktoś, kto ma BCB...

A moja wcześniejsza uwaga, sprawdzałeś?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Zmiana kodowania za pomocą iconv

Nowy postprzez Darek_C++ » czwartek, 17 czerwca 2010, 14:59

Nie ma znaczenia czy zwraca prawidłowy typ size_t, bo wywala taki błąd jaki wywala przy prawidłowym przekazaniu parametrów wywołania.
---
Uzyskałem lib bez podkreślenia implib -a iconv.lib iconv.dll ale nadal jej ten sam błąd
Kod: Zaznacz cały
   size_t xxx = 0;
   xxx = iconv(ic, &ptr_in, &ilen, &ptr_out, &olen); // < TUTAJ BLAD co poprzednio
   if(xxx)
   {
      ShowMessage("TYP OK");
   }
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Zmiana kodowania za pomocą iconv

Nowy postprzez polymorphism » czwartek, 17 czerwca 2010, 15:18

Przecież pisałem o sprawdzeniu wartość, którą zwróci funkcja iconv_open!
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Zmiana kodowania za pomocą iconv

Nowy postprzez Darek_C++ » czwartek, 17 czerwca 2010, 15:21

A JAK MAM Sprawdzić jaka jest wartość typu iconv_t ic;
///
Kod: Zaznacz cały
#define iconv_t libiconv_t
typedef void* iconv_t;

/* Get size_t declaration. */
#include <stddef.h>

/* Get errno declaration and values. */
#include <errno.h>
/* Some systems, like SunOS 4, don't have EILSEQ. Some systems, like BSD/OS,
   have EILSEQ in a different header.  On these systems, define EILSEQ
   ourselves. */
#ifndef EILSEQ
#define EILSEQ @EILSEQ@
#endif


#ifdef __cplusplus
extern "C" {
#endif


/* Allocates descriptor for code conversion from encoding `fromcode' to
   encoding `tocode'. */
#ifndef LIBICONV_PLUG
#define iconv_open libiconv_open
#endif
extern LIBICONV_DLL_EXPORTED iconv_t iconv_open (const char* tocode, const char* fromcode);
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Zmiana kodowania za pomocą iconv

Nowy postprzez polymorphism » czwartek, 17 czerwca 2010, 15:28

Darek_C++ napisał(a):A JAK MAM Sprawdzić jaka jest wartość typu iconv_t ic;

Jesus fuckin' shit :D Czytając dokumentację? Według tego, co znalazłem w sieci, iconv_open zwraca (iconv_t)-1, jeśli nastąpi błąd przy inicjacji konwertera.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Zmiana kodowania za pomocą iconv

Nowy postprzez Darek_C++ » czwartek, 17 czerwca 2010, 15:44

Świetnie... Błąd znalazłem i w zumie sam sobie go zafundowałem podając nieistniejący typ kodowania w wywołaniu funkcji
ic = iconv_open("8859-2", "UTF-8"); < czyli 8859-2 nie ma takiego kodowania
poprawne jest ISO-8859-2 :oops:

Dziękuj za poświęcony Wam za poświęcony czas i pomoc .
---------------
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości

cron