Index: src/uk/me/parabola/imgfmt/app/labelenc/AnyCharsetEncoder.java
===================================================================
--- src/uk/me/parabola/imgfmt/app/labelenc/AnyCharsetEncoder.java	(revision 4811)
+++ src/uk/me/parabola/imgfmt/app/labelenc/AnyCharsetEncoder.java	(working copy)
@@ -22,6 +22,7 @@
 import java.nio.charset.CharsetEncoder;
 import java.nio.charset.CoderResult;
 import java.nio.charset.CodingErrorAction;
+import java.text.Normalizer;
 import java.util.Arrays;
 import java.util.Locale;
 
@@ -59,6 +60,7 @@
 			ucText = text.toUpperCase(Locale.ENGLISH);
 		else
 			ucText = text;
+		ucText = Normalizer.normalize(ucText, Normalizer.Form.NFC);
 
 		// Allocate a buffer for the encoded text. This will be large enough in almost all cases,
 		// but the code below allocates more space if necessary.
Index: src/uk/me/parabola/imgfmt/app/labelenc/Format6Encoder.java
===================================================================
--- src/uk/me/parabola/imgfmt/app/labelenc/Format6Encoder.java	(revision 4811)
+++ src/uk/me/parabola/imgfmt/app/labelenc/Format6Encoder.java	(working copy)
@@ -16,6 +16,7 @@
  */
 package uk.me.parabola.imgfmt.app.labelenc;
 
+import java.text.Normalizer;
 import java.util.Locale;
 
 /**
@@ -60,9 +61,9 @@
 	public EncodedText encodeText(String text) {
 		if (text == null || text.isEmpty())
 			return NO_TEXT;
+		String normalisedText = Normalizer.normalize(text, Normalizer.Form.NFC);
+		String s = transliterator.transliterate(normalisedText).toUpperCase(Locale.ENGLISH);
 
-		String s = transliterator.transliterate(text).toUpperCase(Locale.ENGLISH);
-
 		// Allocate more than enough space on average for the label.
 		// if you overdo it then it will waste a lot of space , but
 		// not enough and there will be an error
Index: src/uk/me/parabola/imgfmt/app/labelenc/Utf8Encoder.java
===================================================================
--- src/uk/me/parabola/imgfmt/app/labelenc/Utf8Encoder.java	(revision 4811)
+++ src/uk/me/parabola/imgfmt/app/labelenc/Utf8Encoder.java	(working copy)
@@ -18,6 +18,7 @@
 
 import java.util.Locale;
 import java.nio.charset.StandardCharsets;
+import java.text.Normalizer;
 
 /**
  * Encoder for labels in utf-8.
@@ -35,7 +36,8 @@
 			uctext = text.toUpperCase(Locale.ENGLISH);
 		else
 			uctext = text;
-
+		uctext = Normalizer.normalize(uctext, Normalizer.Form.NFC);
+		
 		EncodedText et;
 		byte[] buf = uctext.getBytes(StandardCharsets.UTF_8);
 		byte[] res = new byte[buf.length + 1];
Index: test/uk/me/parabola/imgfmt/app/labelenc/CodeFunctionsTest.java
===================================================================
--- test/uk/me/parabola/imgfmt/app/labelenc/CodeFunctionsTest.java	(revision 4811)
+++ test/uk/me/parabola/imgfmt/app/labelenc/CodeFunctionsTest.java	(working copy)
@@ -58,17 +58,18 @@
 		CodeFunctions functions = CodeFunctions.createEncoderForLBL(6, 0);
 
 		CharacterEncoder encoder = functions.getEncoder();
-		Transliterator transliterator = new TableTransliterator("ascii");
-		EncodedText text = encoder.encodeText(transliterator.transliterate("Körnerstraße, Velkomezeříčská, Skólavörðustigur"));
+		// Twülpstedt contains u + "COMBINING DIAERESIS" (0x75 + 0x308)
+		EncodedText text = encoder.encodeText("Körnerstraße, Twülpstedt, Velkomezeříčská, Skólavörðustigur");
 
 		CharacterDecoder decoder = functions.getDecoder();
 		byte[] ctext = text.getCtext();
-		for (int i = 0; i < text.getLength(); i++) {
-			decoder.addByte(ctext[i]);
+		boolean finished = false;
+		int i = 0;
+		while (!finished) {
+			finished = decoder.addByte(ctext[i++]);
 		}
-		decoder.addByte(0xff);
 		String result = decoder.getText().getText();
-		assertEquals("transliterated text", "KORNERSTRASSE, VELKOMEZERICSKA, SKOLAVORDUSTIGUR", result);
+		assertEquals("transliterated text", "KORNERSTRASSE, TWULPSTEDT, VELKOMEZERICSKA, SKOLAVORDUSTIGUR", result);
 	}
 
 	/**
@@ -80,17 +81,19 @@
 		CodeFunctions functions = CodeFunctions.createEncoderForLBL("latin1");
 
 		CharacterEncoder encoder = functions.getEncoder();
-		Transliterator transliterator = new TableTransliterator("latin1");
-		EncodedText text = encoder.encodeText(transliterator.transliterate("Körnerstraße, Velkomezeříčská, Skólavörðustigur"));
+		// Twülpstedt contains u + "COMBINING DIAERESIS" (0x75 + 0x308)
+		EncodedText text = encoder.encodeText("Körnerstraße, Twülpstedt, Velkomezeříčská, Skólavörðustigur");
 
 		CharacterDecoder decoder = functions.getDecoder();
 		byte[] ctext = text.getCtext();
-		for (int i = 0; i < text.getLength(); i++) {
-			decoder.addByte(ctext[i]);
+		boolean finished = false;
+		int i = 0;
+		while (!finished) {
+			finished = decoder.addByte(ctext[i++]);
 		}
 
 		String result = decoder.getText().getText();
-		assertEquals("transliterated text", "Körnerstraße, Velkomezerícská, Skólavörðustigur", result);
+		assertEquals("transliterated text", "Körnerstraße, Twülpstedt, Velkomezerícská, Skólavörðustigur", result);
 	}
 
 	/**
@@ -122,4 +125,6 @@
 			assertEquals("character", i, text.getCtext()[i-1] & 0xff);
 		}
 	}
+	
+	
 }
