diff -ur ../gnustep/core/gui/Source/externs.m ./Source/externs.m
--- ../gnustep/core/gui/Source/externs.m	2007-06-21 16:21:33.000000000 +0700
+++ ./Source/externs.m	2007-06-23 22:13:32.000000000 +0700
@@ -455,6 +455,7 @@
 
 NSString *NSCharacterShapeAttributeName = @"CharacterShape";
 NSString *NSGlyphInfoAttributeName = @"GlyphInfo";
+NSString *GSSubstituteFontAttributeName = @"GSSubstituteFontAttributeName";
 
 NSString *NSPaperSizeDocumentAttribute = @"PaperSize";
 NSString *NSLeftMarginDocumentAttribute = @"LeftMargin";
diff -ur ../gnustep/core/gui/Source/GSTypesetter.m ./Source/GSTypesetter.m
--- ../gnustep/core/gui/Source/GSTypesetter.m	2007-06-08 12:26:33.000000000 +0700
+++ ./Source/GSTypesetter.m	2007-06-23 22:12:04.000000000 +0700
@@ -51,7 +51,11 @@
 
 -(NSFont *) fontForCharactersWithAttributes: (NSDictionary *)attributes
 {
-  NSFont *f = [attributes valueForKey: NSFontAttributeName];
+  NSFont *f;
+
+  f = [attributes valueForKey: GSSubstituteFontAttributeName];
+  if (!f)
+    f = [attributes valueForKey: NSFontAttributeName];
   if (!f)
     f = [NSFont userFontOfSize: 0];
   return f;
Only in ../gnustep/core/gui/Source/: libgnustep-gui.def
diff -ur ../gnustep/core/gui/Source/NSAttributedString.m ./Source/NSAttributedString.m
--- ../gnustep/core/gui/Source/NSAttributedString.m	2007-06-21 16:21:33.000000000 +0700
+++ ./Source/NSAttributedString.m	2007-06-23 22:09:09.000000000 +0700
@@ -984,18 +984,33 @@
 
 - (void) fixFontAttributeInRange: (NSRange)range
 {
+  unsigned int i;
   if (NSMaxRange (range) > [self length])
     {
       [NSException raise: NSRangeException
 		  format: @"RangeError in method -fixFontAttributeInRange: "];
     }
-  // FIXME: Should check for each character if it is supported by the 
-  // assigned font
-  /*
-  Note that this needs to be done on a script basis. Per-character checks
-  are difficult to do at all, don't give reasonable results, and would have
-  really poor performance.
-  */
+  for (i = range.location; i < range.location + range.length; i++)
+    {
+      unichar ch = [[self string] characterAtIndex: i];
+      NSFont *f = [self attribute: NSFontAttributeName
+                         atIndex: i
+                  effectiveRange: NULL];
+
+      if (ch>32 && ![f glyphForCharacter: ch])
+       {
+         f = [f substituteFontWithCharacter: ch];
+         if (f)
+           [self addAttribute: GSSubstituteFontAttributeName
+               value: f
+               range: NSMakeRange(i, 1)];
+       }
+      else
+       {
+         [self removeAttribute: GSSubstituteFontAttributeName
+           range: NSMakeRange(i, 1)];
+       }
+    }
 }
 
 - (void) fixParagraphStyleAttributeInRange: (NSRange)range
diff -ur ../gnustep/core/gui/Source/NSFont.m ./Source/NSFont.m
--- ../gnustep/core/gui/Source/NSFont.m	2007-06-08 12:26:33.000000000 +0700
+++ ./Source/NSFont.m	2007-06-23 22:26:54.000000000 +0700
@@ -1382,7 +1382,39 @@
   return _fontRef;
 }
 
+-(NSFont *) substituteFontWithCharacter: (unichar)ch
+{
+  static NSArray *substitutionFonts;
+  static int c;
+  NSFont *f;
+  int i;
+
+  if (!substitutionFonts)
+    {
+      NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
+      substitutionFonts = [[defs objectForKey: @"GSSubstituteFonts"] retain];
+      c = [substitutionFonts count];
+      if (substitutionFonts && !c)
+       {
+         substitutionFonts = [[[NSFontManager sharedFontManager]
+           availableFonts] retain];
+         c = [substitutionFonts count];
+       }
+    }
 
+  for (i = 0; i < c; i++)
+    {
+      f=[[isa alloc] initWithName: [substitutionFonts objectAtIndex: i]
+                          matrix: matrix
+                             fix: matrixExplicitlySet
+                      screenFont: screenFont
+                            role: role];
+      if ([f glyphForCharacter: ch])
+        return AUTORELEASE(f);
+      RELEASE(f);
+    }
+  return nil;
+}
 @end
 
 
