00001
00002
00003
00004
00005
00006
00007
00008 #include <iostream>
00009 #include <cstdlib>
00010 #include <iomanip>
00011 #include <locale>
00012 #include <glibmm/convert.h>
00013 #include <cerrno>
00014 #include <cstring>
00015
00016
00017 int main()
00018 {
00019 setlocale(LC_ALL, "");
00020
00021 char buf[256];
00022
00023 size_t inbytes = 0;
00024 for (int i = 1; i < 256; ++i)
00025 buf[inbytes++] = i;
00026
00027 Glib::IConv iconv("UTF8", "ISO8859-1");
00028 #if 0
00029 iconv_t cd = iconv_open("UTF8", "ISO8859-1");
00030 if (cd == (iconv_t)-1)
00031 {
00032 perror("iconv_open");
00033 exit(1);
00034 }
00035 #endif
00036
00037 char buf2[512];
00038 size_t outbytes = sizeof(buf2);
00039 char* inbuf = buf;
00040 char* outbuf = buf2;
00041
00042 while(inbytes > 0)
00043 {
00044 size_t res = iconv.iconv(&inbuf,& inbytes,& outbuf,& outbytes);
00045 if (res == static_cast<size_t>(-1))
00046 {
00047 std::cerr << "iconv: " << std::strerror(errno) << std::endl;
00048 exit(1);
00049 }
00050 else
00051 std::cout << "res = " << res << "; inbytes = " << inbytes << "; outbytes = " << outbytes << '\n';
00052 }
00053
00054
00055
00056 std::cout << "outbytes = " << outbytes << '\n';
00057 for (int i = 0; i < sizeof(buf2) - outbytes; ++i)
00058 {
00059 unsigned int data = (unsigned int)(unsigned char)buf2[i];
00060 std::cout << i << " : " << data;
00061 if (data == 194 || data == 195)
00062 {
00063 ++i;
00064 std::cout << " " << (unsigned int)(unsigned char)buf2[i];
00065 }
00066 std::cout << '\n';
00067 }
00068
00069 std::string s(buf2, sizeof(buf2) - outbytes);
00070 std::cout << "Output : \"" << s << "\"\n";
00071
00072 char const* charset;
00073 bool is_utf8 = g_get_charset(&charset);
00074 std::cout << "g_get_charset() = " << charset << std::endl;
00075
00076 if (!is_utf8)
00077 {
00078 std::cout << "charset is not \"UTF-8\", fix that.\n";
00079 exit(1);
00080 }
00081
00082 Glib::ustring str(s);
00083 std::cout << "strlen = " << str.length() << '\n';
00084
00085 std::cout << "Glib::ustring: \"" << str << "\"\n";
00086
00087 std::cout << "Printable characters:\n";
00088 Glib::ustring output;
00089 for (Glib::ustring::iterator iter = str.begin(); iter != str.end(); ++iter)
00090 {
00091 Glib::ustring::iterator::value_type c =* iter;
00092 if (g_unichar_isprint(c))
00093 {
00094 output += c;
00095 std::cout << c << '\n';
00096 }
00097 else
00098 output += '?';
00099 }
00100 std::cout << "Printable characters: \"" << output << "\"\n";
00101 }