UTF-8 mit SQL-Datenbanken

+ andere TechDocs
+ SQL mit Java
+ SQL
+




Inhalt

  1. UTF-8 mit MySQL
  2. Probleme mit UTF-8 unter Oracle
    Encoding und Feldlängen, Ändern des Oracle-Datenbank-Encodings, Einstellung von NLS_LANG
  3. Testprogramm für das Speichern von Sonderzeichen in der Datenbank
  4. Java-Codeschnipsel zu UTF-8
  5. Verschiedene UTF-8-Kodierungen für das Euro-Symbol


UTF-8 mit MySQL

MySQL verwendet normalerweise den Latin1-Zeichensatz (entspricht ISO-8859-1). Dieser 8-bit-Zeichensatz enthält die deutschen Umlaute, aber nicht das Euro-Zeichen '€'.

Eine gern verwendete Alternative zu Latin1 ist UTF-8. Die ersten 128 Zeichen von UFT-8 entsprechen den ersten 128 Zeichen des ASCII-Zeichensatzes (7 bit) und werden in einem Byte kodiert. Alle anderen Zeichen benötigen zwei bis vier Bytes. Zum Beispiel die deutschen Umlaute und Sonderzeichen 'äöüß§' belegen zwei Bytes und das Euro-Zeichen '€' drei Bytes.

Weiteres zu UTF-8 erfahren Sie unter: http://de.wikipedia.org/wiki/Utf-8.

Für einen ersten Versuch verfahren Sie folgendermaßen:

  1. MySQL unterstützt erst ab Version 4.1.1 Unicode. Die folgenden Beispiele sind mit Version 4.1.12 getestet worden.
  2. Falls noch nicht geschehen, installieren Sie MySQL zum Beispiel wie beschrieben unter: mysql.htm#InstallationUnterWindows.
  3. Starten Sie die Verbindung zu MySQL über die übliche zu Ihrer Installation passende DriverManager-Connection-URL, also zum Beispiel 'jdbc:mysql://192.168.0.100:3306/MeineDb'.
  4. Im Folgenden soll eine Tabellenspalte für Latin1 und eine weitere für UTF-8 definiert werden.
    Führen Sie folgende SQL-Kommandos aus (zum Beispiel per Java-Programm oder einfacher mit SQuirreL):

    drop table if exists MeinUtf8Test;

    create table MeinUtf8Test ( vrchrLtn1 varchar(10) CHARACTER SET Latin1, vrchrUtf8 varchar(10) CHARACTER SET Utf8 );

    insert into MeinUtf8Test ( vrchrLtn1, vrchrUtf8 ) values ( 'äöüß§€áàâ€', 'äöüß§€áàâ€' );

    select * from MeinUtf8Test;

  5. Bei üblichen Systemkonfigurationen erhalten Sie:

    vrchrLtn1vrchrUtf8
    äöüß§?áàâ?äöüß§?áàâ?

    Die deutschen Umlaute werden korrekt gespeichert, aber in beiden Spalten fehlen die Euro-Zeichen. Die UTF-8-Deklaration hat also nicht zum Erfolg geführt.

  6. Sehen Sie sich mit dem SQL-Kommando 'Show Variables;' die MySQL-Character-Einstellungen an. Das Ergebnis könnte zum Beispiel so aussehen:

    Variable_nameValue
    character_set_clientlatin1
    character_set_connectionlatin1
    character_set_databaselatin1
    character_set_resultsNULL
    character_set_serverlatin1
    character_set_systemutf8
    collation_connectionlatin1_swedish_ci
    collation_databaselatin1_swedish_ci
    collation_serverlatin1_swedish_ci

    Über SQL-Kommandos wie 'SET NAMES 'utf8';', 'set character_set_database=utf8;' und 'set character_set_server=utf8;' können Sie diese Einträge ändern, was aber leider zumindest mit MySQL 4.1.12 und dem JDBC-Treiber 'mysql-connector-java-3.1.11-bin.jar' nicht zum gewünschten Erfolg führt.

  7. Starten Sie die Verbindung zu MySQL neu, aber diesmal über eine erweiterte DriverManager-Connection-URL, nämlich:
    'jdbc:mysql://192.168.0.100:3306/MeineDb?useUnicode=true&characterEncoding=UTF-8'
    (passen Sie den Teil '192.168.0.100:3306/MeineDb' an Ihre Installation an).
    Wichtig ist der angehängte Teil '?useUnicode=true&characterEncoding=UTF-8'.
    Wenn Sie die SQL-Kommandos per Java-Programm ausführen, tragen Sie diese URL beim 'DriverManager.getConnection()'-Aufruf ein.
    Wenn Sie SQuirreL verwenden, tragen Sie diese URL ein unter: rechte Maustaste auf die Verbindung im 'Aliases'-Fenster | 'Modify Alias...' | 'URL'.
  8. Löschen Sie die Tabelle 'MeinUtf8Test' und führen Sie die oben genannten SQL-Kommandos erneut aus. Diesmal erhalten Sie:

    vrchrLtn1vrchrUtf8
    äöüß§ΠáàâΠäöüß§€áàâ€

    Die Latin1-Spalte 'vrchrLtn1' kann das Euro-Zeichen nicht speichern, aber in der UTF-8-Spalte 'vrchrUtf8' funktioniert es.

  9. 'Show Variables;' zeigt diesmal korrekt an, dass die 'connection' auf 'utf8' umgeschaltet worden ist:

    Variable_nameValue
    character_set_connectionutf8
    collation_connectionutf8_general_ci
  10. Die 'collation_...'-Einträge wirken sich zum Beispiel auf die Sortierreihenfolge der Zeichen aus. Siehe hierzu: mysql.htm#Sortierung.
  11. Statt über den URL-Anhang können Sie die gewünschten Parameter natürlich auch in der 'mysql.ini'-Konfigurationsdatei vorgeben, zu Beispiel so:
    default-character-set=utf8
    Dies geht allerdings nicht immer: Zum Beispiel erlauben einige Webhoster keinen Zugriff auf die 'mysql.ini'.


Probleme mit UTF-8 unter Oracle

Encoding und Feldlängen

Mit der Oracle-Datenbank gibt es immer wieder Unsicherheiten zu folgende Fragen:

  1. Werden 'varchar2'-Texte in UTF-8 gespeichert?
  2. Reserviert 'varchar2(3000)' Platz für 3000 Bytes oder 3000 Characters?
  3. Passen in 'varchar2(3000 CHAR)' wirklich 3000 Characters?
  4. Wie ist die 4000-Bytes-Grenze zu verstehen?

Diese Fragen klingen trivial, sind es aber nicht.

Ob 'varchar2'-Texte in UTF-8 gespeichert werden, ist einstellbar. Die aktuelle Einstellung erfahren Sie über den NLS_CHARACTERSET-Parameter mit dem SQL-Kommando:

select * from nls_database_parameters;

Das Ergebnis könnte zum Beispiel lauten:

ParameterValue
NLS_LANGUAGEGERMAN
NLS_TERRITORYGERMANY
NLS_CHARACTERSETAL32UTF8
NLS_NCHAR_CHARACTERSETAL16UTF16
NLS_LENGTH_SEMANTICSCHAR
NLS_SORTBINARY
NLS_COMPBINARY
NLS_NCHAR_CONV_EXCPFALSE

Ob 'varchar2(3000)' Platz für 3000 Bytes oder 3000 Characters reserviert, ist ebenfalls einstellbar. Die Basisvoreinstellung zeigt obiges 'select * from nls_database_parameters'-Kommando. Ist 'NLS_LENGTH_SEMANTICS' auf 'CHAR' eingestellt, reserviert 'varchar2(3000)' Platz für bis zu 3000 Characters.

Für einzelne Spalten kann dies abweichend von der Basisvoreinstellung vorgegeben werden:
'varchar2(3000 BYTE)' reserviert Platz für 3000 Bytes,
'varchar2(3000 CHAR)' reserviert Platz für bis zu 3000 Characters.

Bei UTF-8-Kodierung belegen die einzelnen Zeichen mindestens ein Byte und maximal vier Bytes (weiteres hierzu siehe http://de.wikipedia.org/wiki/Utf-8). Wenn der Oracle-'CHARACTERSET' auf UTF-8 eingestellt ist und 'NLS_LENGTH_SEMANTICS' auf 'BYTE' eingestellt ist, kann es also passieren, dass 'varchar2(3000)' nur 750 Zeichen speichern kann, falls der Text viele exotische Zeichen (mit 4-Byte-Kodes) enthält!

Häufig wird angenommen, dass man auf der sicheren Seite ist, wenn 'NLS_LENGTH_SEMANTICS' auf 'CHAR' eingestellt ist oder wenn die Spalte explizit per 'varchar2(3000 CHAR)' definiert ist. Leider kann trotzdem nicht davon ausgegangen werden, so zuverlässig 3000 Zeichen speichern zu können.

Zusätzlich zu der Obergrenze, die bei der Tabellendefinition bei 'varchar2(...)' definiert wird, gibt es bei Oracle eine zweite davon unabhängige Obergrenze: Es können maximal 4000 Bytes gespeichert werden. Diese Grenze gilt auch dann, wenn 'NLS_LENGTH_SEMANTICS' auf 'CHAR' eingestellt ist. Im schlimmsten Fall, wenn der Text viele exotische Zeichen (mit 4-Byte-Kodes) enthält, können trotz der 'varchar2(3000 CHAR)'-Definition nur 1000 Zeichen gespeichert werden!

Führen Sie folgende SQL-Kommandos aus (zum Beispiel per SQuirreL), um das Gesagte nachzuvollziehen (achten Sie darauf, dass Oracle auf UTF-8 eingestellt ist) (getestet mit 'Oracle9i Enterprise Edition Release 9.2.0.7.0 - 64bit' und dem JDBC-Typ-4-Treiber 'oracle_db.jar' Version 9.2.0.1.0):

select * from nls_database_parameters;

create table MeinUtf8Test ( vrchr10Byte varchar2(10 BYTE), vrchr10Char varchar2(10 CHAR), vrchr3000Char varchar2(3000 CHAR) );

insert into MeinUtf8Test ( vrchr10Byte, vrchr10Char ) values ( '1234567890', 'äöüß§€áàâ€' );

insert into MeinUtf8Test ( vrchr10Byte, vrchr10Char ) values ( '€€€', '€€€€€€€€€€' );

select * from MeinUtf8Test;

Bis hierher funktioniert alles.

Die folgenden SQL-Kommandos führen zu Exceptions:

insert into MeinUtf8Test ( vrchr10Byte ) values ( '€€€€' );

--> 'Error: java.sql.SQLException: ORA-01401: Eingefügter Wert zu groß für Spalte, SQL State: 23000, Error Code: 1401'

Diese Exception ist nicht überraschend: Der vier Zeichen lange Textstring '€€€€' ist UTF-8-kodiert 12 Bytes lang und kann deshalb nicht in 'varchar2(10 BYTE)' gespeichert werden.

Aber die folgende Exception sorgt meistens für Überraschung:

insert into MeinUtf8Test ( vrchr3000Char ) values ( '0001_0100__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 0101_0200__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 0201_0300__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 0301_0400__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 0401_0500__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 0501_0600__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 0601_0700__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 0701_0800__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 0801_0900__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 0901_1000__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 1001_1100__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 1101_1200__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 1201_1300__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 1301_1400__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 1401_1500__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 1501_1600__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 1601_1700__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 1701_1800__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 1801_1900__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 1901_2000__€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ ' );

--> 'Error: java.sql.SQLException: ORA-01704: Zeichenfolge zu lang, SQL State: 42000, Error Code: 1704'

Der Versuch, nur 2000 Zeichen in eine als 'varchar2(3000 CHAR)' definierte Spalte zu speichern, schlägt fehl (wegen der 4000-Byte-Obergrenze)!

Weiteres hierzu finden Sie unter: http://unix.business.utah.edu/doc/applications/oracle/doc_cd/server.901/a88827/ch850.htm und http://unix.business.utah.edu/doc/applications/oracle/doc_cd/server.901/a90125/sql_elements2.htm#45443.

Ändern des Oracle-Datenbank-Encodings

Oracle-Datenbanken werden bei der Installation auf das gewünschte grundsätzliche Encoding eingestellt. Ein späterer Wechsel ist schwierig und problematisch und bedingt häufig einen Export und Import aller Daten. Falls Sie trotzdem im Nachhinein das Encoding wechseln müssen, können Sie Folgendes versuchen (was nicht immer gelingt) (machen Sie vorher einen Backup und passen Sie die Einträge an):

  1. Erstellen Sie folgende zwei SqlPlus-Skripte:

    OracleDB-umstellen-UTF8.sql

    ALTER SYSTEM ENABLE RESTRICTED SESSION;
    ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
    ALTER SYSTEM SET AQ_TM_PROCESSES=0;
    ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;
    ALTER DATABASE CHARACTER SET AL32UTF8;
    QUIT;
    

    Check-NLS.sql

    Set Pagesize 100;
    Column Parameter format a30;
    Column Value     format a30;
    Select Parameter, Value from nls_database_parameters;
    Select Parameter, Value from nls_database_parameters where Parameter = 'NLS_CHARACTERSET';
    Quit;
    
  2. Führen Sie folgende Kommandos aus:

    sqlplus sys@XE as sysdba @OracleDB-umstellen-UTF8.sql

    StopDB.bat

    StartDB.bat

    sqlplus system@XE @Check-NLS.sql

Einstellung von NLS_LANG

Wenn Sie als Client SqlPlus verwenden, muss die NLS_LANG-Variable korrekt gesetzt sein. Wenn keine NLS_LANG-Umgebungsvariable gesetzt ist, gilt unter Windows der in der Registry voreingestellte Wert, meistens:

German_Germany.WE8MSWIN1252

Wenn Sie in UTF8 gespeicherte SQL-Skripte verarbeiten wollen, muss auf der Clientseite UTF8 eingestellt werden, zum Beispiel so:

set NLS_LANG=German_Germany.AL32UTF8

Falls Sie im Windows-Kommandozeilenfenster mit CP850 erstellte SQL-Kommandos mit SqlPlus verarbeiten, kann folgende Einstellung notwendig sein:

set NLS_LANG=German_Germany.WE8PC850

Die korrekte clientseitige NLS_LANG-Einstellung richtet sich also nicht nach dem in der DB eingestelltem Encoding, sondern nach dem clientseitig verwendeten Encoding.



Testprogramm für das Speichern von Sonderzeichen in der Datenbank

Das folgende Programm speichert Sonderzeichen in der Datenbank, liest sie wieder aus und vergleicht den gelesenen String mit dem vorher gespeicherten. Sie können es entweder mit den voreingestellten Sonderzeichen äöüß§€½²√∑ verwenden oder andere Sonderzeichen als Kommandozeilenparameter übergeben.

Fügen Sie den zur Datenbank passenden JDBC-Treiber beim Aufruf zum Classpath hinzu, zum Beispiel so:

javac SqlEncodingTest.java 
java -cp .;ojdbc5.zip SqlEncodingTest "" "" meinUsr meinPwd [für lokale Oracle-XE-DB]
java -cp .;ojdbc5.zip SqlEncodingTest "" "" meinUsr meinPwd "äöüß§€½²√∑..." [falls andere Sonderzeichen]
java -cp .;<JDBC-Treiber> SqlEncodingTest "<driver>" "<url>" "<usr>" "<pwd>" [falls andere DB]

Falls es Unterschiede gibt, können Sie diese am einfachsten analysieren über die resultierenden Unicode-Hexwerte in:

type x.properties


import java.io.FileOutputStream;
import java.sql.*;
import java.util.Properties;

/**
 * HTML: <html>&#x00E4;&#x00F6;&#x00FC;&#x00DF;&#x00A7;&#x20AC;&#x00BD;&#x00B2;&#x221A;&#x2211;&#x0080;</html><br>
 * Aufruf fuer lokale Oracle-XE-DB:
 *    javac SqlEncodingTest.java
 *    java -cp .;ojdbc5.zip SqlEncodingTest "" "" "<usr>" "<pwd>"
 *    java -cp .;ojdbc5.zip SqlEncodingTest "" "" "<usr>" "<pwd>" "äöüß§€..."
 *    type x.properties
 * Aufruf fuer andere DB:
 *    java -cp .;<JDBC-Treiberdatei> SqlEncodingTest "<driver>" "<url>" "<usr>" "<pwd>"
 *    type x.properties
 */
public class SqlEncodingTest
{
   public static void main( String[] args ) throws Exception
   {
      String dbDrv = getArg( 0, args, "oracle.jdbc.driver.OracleDriver" );
      String dbUrl = getArg( 1, args, "jdbc:oracle:thin:@localhost:1521:XE" );
      String dbUsr = getArg( 2, args, "" );
      String dbPwd = getArg( 3, args, "" );
      String s1    = getArg( 4, args, "\u00E4\u00F6\u00FC\u00DF\u00A7\u20AC\u00BD\u00B2\u221A\u2211\u0080" );

      String s2 = storeAndReadDb( dbDrv, dbUrl, dbUsr, dbPwd, s1 );
      storeProperties( new String[] { "s1", s1, "s2", s2 }, "x.properties" );

      System.out.println( "Original-Sonderzeichen: " + s1 );
      System.out.println( "Sonderzeichen aus DB:   " + s2 );
      System.out.println( "Ergebnis ist " + (( s1.equals( s2 ) ) ? "korrekt." : "fehlerhaft.") );
   }

   static String getArg( int i, String[] args, String defaultStr )
   {
      return ( args != null && args.length > i && args[i] != null && args[i].length() > 0 ) ? args[i] : defaultStr;
   }

   static String storeAndReadDb( String dbDrv, String dbUrl, String dbUsr, String dbPwd, String s1 ) throws Exception
   {
      String sqlCreate = "Create Table MeinUtf8Test ( Text varchar2(20 char) )";
      String sqlInsert = "Insert into MeinUtf8Test Values ( ? )";
      String sqlRead   = "Select Text from MeinUtf8Test";
      String sqlDrop   = "Drop Table MeinUtf8Test";
      Connection        cn = null;
      PreparedStatement ps = null;
      Statement         st = null;
      ResultSet         rs = null;
      try {
        String s2 = null;
        Class.forName( dbDrv );
        cn = DriverManager.getConnection( dbUrl, dbUsr, dbPwd );
        st = cn.createStatement();
        st.executeUpdate( sqlCreate );
        ps = cn.prepareStatement( sqlInsert );
        ps.setString( 1, s1 );
        ps.executeUpdate();
        rs = st.executeQuery( sqlRead );
        if( rs.next() ) s2 = rs.getString( 1 );
        st.executeUpdate( sqlDrop );
        return s2;
      } finally {
        try { if( null != rs ) rs.close(); } catch( Exception ex ) {}
        try { if( null != st ) st.close(); } catch( Exception ex ) {}
        try { if( null != ps ) ps.close(); } catch( Exception ex ) {}
        try { if( null != cn ) cn.close(); } catch( Exception ex ) {}
      }
   }

   static void storeProperties( String[] keysAndValues, String filename ) throws Exception
   {
      Properties prop = new Properties();
      for( int i = 0; i < keysAndValues.length; i+=2 ) {
         String v = keysAndValues[i+1];
         prop.put( keysAndValues[i], ( v != null ) ? v : "" );
      }
      prop.store( new FileOutputStream( filename ), null );
   }
}


Java-Codeschnipsel zu UTF-8

Die Länge eines UTF-8-kodierten Textstrings in Anzahl Bytes kann folgendermaßen ermittelt werden:

  meinString.getBytes( "UTF-8" ).length

Um einen Textstring für eine maximale Länge in Bytes zu begrenzen (oder aufzuteilen), muss die maximal mögliche Zeichenanzahl bis zu dieser Byte-Grenze ermittelt werden. Dabei muss beachtet werden, dass die Grenze nicht mitten in einem UTF-8-Drei-Byte-Code verlaufen darf, sondern nur zwischen ganzen Zeichen.

  /**
   * Findet fuer Strings fuer eine gegebene maximale Laenge in Bytes die maximale Laenge in Anzahl Characters.
   * @param str           Der zu untersuchende String
   * @param charsetName   Name des Charactersets (z.B. "UTF-8")
   * @param maxByteLength Maximale Laenge in Bytes (z.B. 4000 fuer Oracle-DB)
   * @return              Maximale Laenge in Anzahl Characters
   */
  public static int findMaxUtfCharLength( String str, String charsetName, int maxByteLength )
  {
    try {
      byte[] b = str.getBytes( charsetName );
      if( b.length <= maxByteLength ) return str.length();
      while( (0 < maxByteLength) && (((byte) (b[maxByteLength] & 0xC0)) == (byte) 0x80) )  maxByteLength--;
      return (new String( b, 0, maxByteLength, charsetName )).length();
    } catch( UnsupportedEncodingException ex ) {
      throw new RuntimeException( "UnsupportedEncodingException with " + charsetName, ex );
    }
  }


Verschiedene UTF-8-Kodierungen für das Euro-Symbol

Zu vielen Zeichen gibt es mehrere Möglichkeiten zur Kodierung in UTF-8. Zum Beispiel das Euro-Zeichen ('€') kann sowohl als Zwei-Byte-Code "0xC2, 0x80" als auch als Drei-Byte-Code "0xE2, 0x82, 0xAC" kodiert werden.

Siehe hierzu:
http://www.fileformat.info/info/unicode/char/0080/index.htm (unter "Java Data") und
http://www.fileformat.info/info/unicode/char/20ac/index.htm.

Ähnliches gilt auch bei der Kodierung für HTML-Seiten: In den meisten Fällen werden sowohl '&#x80;' (entspricht 'C2 80') als auch '&#x20AC;' (entspricht 'E2 82 AC') als '€' dargestellt.





Weitere Themen: andere TechDocs | SQL mit Java | SQL | Glossar
© 1998-2007 Torsten Horn, Aachen