String conversion with different charsets
authorJoey Schulze <joey@infodrom.org>
Wed, 8 Feb 2006 08:54:54 +0000 (08:54 +0000)
committerJoey Schulze <joey@infodrom.org>
Wed, 8 Feb 2006 08:54:54 +0000 (08:54 +0000)
charset.c [new file with mode: 0644]
charset.h [new file with mode: 0644]

diff --git a/charset.c b/charset.c
new file mode 100644 (file)
index 0000000..b2278cb
--- /dev/null
+++ b/charset.c
@@ -0,0 +1,84 @@
+/*
+    Copyright (c) 2006  Joey Schulze <joey@infodrom.org>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <locale.h>
+#include <langinfo.h>
+#include <string.h>
+#include <iconv.h>
+
+char *charset = NULL;
+
+/*
+ * Determine the output character set
+ */
+void set_charset()
+{
+  setlocale (LC_CTYPE, "");
+
+  charset = strdup (nl_langinfo(CODESET));
+}
+
+/*
+ * Convert a word from an arbitrary charset into the output character set
+ *
+ * No conversion is performed when both charsets are equal
+ */
+char *convert_word(const char *encoding, char *inbuf, char *outbuf, size_t outbytesleft)
+{
+  iconv_t cd;
+  char *inptr, *outptr;
+  size_t inbytesleft;
+  size_t nconv;
+
+  if (!charset || !strcasecmp (encoding, charset)) {
+    memmove (outbuf, inbuf, strlen(inbuf)<outbytesleft?strlen(inbuf)+1:strlen(inbuf));
+    outbuf[outbytesleft-1] = '\0';
+    return outbuf;
+  }
+
+  cd = iconv_open (charset, encoding);
+
+  inbytesleft = strlen (inbuf)+1;
+  inptr = inbuf;
+  outptr = outbuf;
+
+  nconv = iconv (cd, &inptr, &inbytesleft, &outptr, &outbytesleft);
+  iconv_close(cd);
+
+  return outbuf;
+}
+
+
+/*
+ * Needs to be called with LANG=de_DE.ISO-8859-1
+
+void test_charset()
+{
+  char outbuf[100];
+  size_t size = 99;
+
+  memset (outbuf, 0, sizeof (outbuf));
+  printf ("%s\n", convert_word ("UTF-8", "für ein", outbuf, size));
+  printf ("%s\n", outbuf);
+  if (!strcmp(outbuf, "für ein"))
+    printf ("charset.c: test passed\n");
+  else
+    printf ("charset.c: test failed\n");
+}
+
+*/
diff --git a/charset.h b/charset.h
new file mode 100644 (file)
index 0000000..57b45fe
--- /dev/null
+++ b/charset.h
@@ -0,0 +1,23 @@
+/*
+    Copyright (c) 2006  Joey Schulze <joey@infodrom.org>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+extern char *charset;
+
+void set_charset();
+
+char *convert_word(const char *encoding, char *inbuf, char *outbuf, size_t outbytesleft);