diff --git a/graphics/x11drv/codepage.c b/graphics/x11drv/codepage.c
index 092c7ca2f5c6552ee96fae4cc91d6265726c3454..c4d9480cbb64ef5e2511468ed9d2290666a28289 100644
--- a/graphics/x11drv/codepage.c
+++ b/graphics/x11drv/codepage.c
@@ -364,6 +364,30 @@ static XChar2b* X11DRV_unicode_to_char2b_cp950( fontObject* pfo,
     return str2b;
 }
 
+static XChar2b* X11DRV_unicode_to_char2b_symbol( fontObject* pfo,
+						 LPCWSTR lpwstr, UINT count )
+{
+    XChar2b *str2b;
+    UINT i;
+    char ch = pfo->fs->default_char;
+
+    if (!(str2b = HeapAlloc( GetProcessHeap(), 0, count * sizeof(XChar2b) )))
+	return NULL;
+
+    for (i = 0; i < count; i++)
+    {
+	str2b[i].byte1 = 0;
+	if(lpwstr[i] >= 0xf000 && lpwstr[i] < 0xf100)
+	    str2b[i].byte2 = lpwstr[i] - 0xf000;
+	else if(lpwstr[i] < 0x100)
+	    str2b[i].byte2 = lpwstr[i];
+	else
+	    str2b[i].byte2 = ch;
+    }
+
+    return str2b;
+}
+
 
 static void X11DRV_DrawString_normal( fontObject* pfo, Display* pdisp,
                                       Drawable d, GC gc, int x, int y,
@@ -700,4 +724,13 @@ const X11DRV_CP X11DRV_cptable[X11DRV_CPTABLE_COUNT] =
 	X11DRV_TextExtents_dbcs_2fonts,
         X11DRV_GetTextMetricsA_cp932,
     },
+    { /* SYMBOL */
+	X11DRV_enum_subfont_charset_normal,
+	X11DRV_unicode_to_char2b_symbol,
+	X11DRV_DrawString_normal,
+	X11DRV_TextWidth_normal,
+	X11DRV_DrawText_normal,
+	X11DRV_TextExtents_normal,
+	X11DRV_GetTextMetricsA_normal,
+    }
 };
diff --git a/graphics/x11drv/xfont.c b/graphics/x11drv/xfont.c
index b9382d5e88423d2839641965e6406c1bdf84bb95..ac9ab65e0b09bb6476ac74f91bbe29eac21f012d 100644
--- a/graphics/x11drv/xfont.c
+++ b/graphics/x11drv/xfont.c
@@ -141,8 +141,8 @@ static const SuffixCharset sufch_microsoft[] = {
     { "cp1255", HEBREW_CHARSET, 1255, X11DRV_CPTABLE_SBCS },
     { "cp1256", ARABIC_CHARSET, 1256, X11DRV_CPTABLE_SBCS },
     { "cp1257", BALTIC_CHARSET, 1257, X11DRV_CPTABLE_SBCS },
-    { "fontspecific", SYMBOL_CHARSET, CP_SYMBOL, X11DRV_CPTABLE_SBCS },
-    { "symbol", SYMBOL_CHARSET, CP_SYMBOL, X11DRV_CPTABLE_SBCS },
+    { "fontspecific", SYMBOL_CHARSET, CP_SYMBOL, X11DRV_CPTABLE_SYMBOL },
+    { "symbol", SYMBOL_CHARSET, CP_SYMBOL, X11DRV_CPTABLE_SYMBOL },
     {   NULL,   ANSI_CHARSET, 1252, X11DRV_CPTABLE_SBCS }};
 
 static const SuffixCharset sufch_tcvn[] = {
diff --git a/include/x11font.h b/include/x11font.h
index 3147aa7510e8ee69b90f3007a7a83913907ebb39..cde280e4b3499f8ba7197cec0b4c42945bb9895d 100644
--- a/include/x11font.h
+++ b/include/x11font.h
@@ -80,6 +80,7 @@ enum X11DRV_CPTABLE
     X11DRV_CPTABLE_CP936,
     X11DRV_CPTABLE_CP949,
     X11DRV_CPTABLE_CP950,
+    X11DRV_CPTABLE_SYMBOL,
     X11DRV_CPTABLE_COUNT
 };
 
diff --git a/objects/text.c b/objects/text.c
index 42195e0fe15664b4e5a5549c804559927e5c457b..d28ec0fe22103dac8adbe06aee8042863d75e39c 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -43,8 +43,8 @@ LPWSTR FONT_mbtowc(HDC hdc, LPCSTR str, INT count, INT *plenW, UINT *pCP)
         cp = csi.ciACP;
     else {
         switch(charset) {
-	case SYMBOL_CHARSET:
-	    cp = CP_SYMBOL;
+	case SYMBOL_CHARSET: /* We don't want any translation here */
+	    cp = GetACP();
 	    break;
 	case OEM_CHARSET:
 	    cp = GetOEMCP();