diff --git a/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapper.java b/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapper.java
index bc0fb76d319eb1c17c1c3a80fb62cdeb133dbcf1..307ae02d74b130c826ea91b9150f0134563bfe8e 100644
--- a/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapper.java
+++ b/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapper.java
@@ -54,7 +54,7 @@ public class IFrameDeliveryMapper implements Mapper {
 	private static final String DEFAULT_CONTENT_TYPE = "text/html";
 	private static final String XHTML_EXTENSION = "xhtml";
 	private static final String XHTML_CONTENT_TYPE = "application/xhtml+xml";
-	private static final Pattern PATTERN_ENCTYPE = Pattern.compile("<meta.*charset=([^\"\']*)[\"\']", Pattern.CASE_INSENSITIVE);
+	private static final Pattern PATTERN_ENCTYPE = Pattern.compile("<meta[^>]*charset=[\"\']?([A-Za-z0-9.:\\-_]*)", Pattern.CASE_INSENSITIVE);
 	private static final Pattern PATTERN_XML_ENCTYPE = Pattern.compile("<\\?xml.*encoding=[\"\']([^\"\']*)[\"\']", Pattern.CASE_INSENSITIVE);
 	private static final Pattern PATTERN_CONTTYPE = Pattern.compile("<meta.*content-type\"?\\s*content\\s*=\\s*[\"]?+(.+?)([\"]?+\\s*/>)", Pattern.CASE_INSENSITIVE);
 	private static final Pattern PATTERN_DOCTYPE = Pattern.compile("<!DOCTYPE\\s*html\\s*PUBLIC\\s*[\"\']\\s*-//W3C//DTD\\s*(.+?)(//EN)", Pattern.CASE_INSENSITIVE);
@@ -515,7 +515,7 @@ public class IFrameDeliveryMapper implements Mapper {
 			// use found char set
 			String htmlcharset = m.group(1);
 			//if longer than 50 the regexp did fail
-			if (htmlcharset.length() < 50 ) {
+			if (htmlcharset.length() < 50 && htmlcharset.length() != 0) {
 				return htmlcharset;
 			}
 		}
diff --git a/src/test/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapperTest.java b/src/test/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapperTest.java
index d311994714787029542994ba354471c3dce97a8c..28b41cee5331e1b5ca7d50ddb04ededf3e5d2e10 100644
--- a/src/test/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapperTest.java
+++ b/src/test/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapperTest.java
@@ -38,5 +38,30 @@ public class IFrameDeliveryMapperTest {
 		
 		String encoding2 = mapper.guessEncoding("<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>");
 		Assert.assertEquals("UTF-8", encoding2);
+
+		// capital / lowercase mixed
+		String encoding3 = mapper.guessEncoding("<meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\">");
+		Assert.assertEquals("utf-8", encoding3);
+
+		// short charset rules often used in html5 apps
+		String encoding4 = mapper.guessEncoding("<meta charset=\"utf-8\">");
+		Assert.assertEquals("utf-8", encoding4);
+
+		String encoding5 = mapper.guessEncoding("<meta charset='utf-8'>");
+		Assert.assertEquals("utf-8", encoding5);
+
+		String encoding6 = mapper.guessEncoding("<meta charset=utf-8>");
+		Assert.assertEquals("utf-8", encoding6);
+
+		String encoding7 = mapper.guessEncoding("<meta charset=utf-8/>");
+		Assert.assertEquals("utf-8", encoding7);
+
+		String encoding8 = mapper.guessEncoding("<meta charset=utf-8 />");
+		Assert.assertEquals("utf-8", encoding8);
+
+		// wrong stuff
+		String encoding9 = mapper.guessEncoding("<meta gugus='asdf'><dings charset='utf-8' />");
+		Assert.assertNull(encoding9);
+		
 	}
 }