Index: components/synedit/synedit.pp
===================================================================
--- components/synedit/synedit.pp	(revision 16009)
+++ components/synedit/synedit.pp	(working copy)
@@ -1125,7 +1125,32 @@
 {$ENDIF}
   Clipbrd;
 
+{$IFDEF DoubleChrWidthHack}
+function ChrDispWidth(s:Pchar):Integer;
+var
+  ucsx: Array [0..1] of Widechar;
+  ucs: Widechar absolute ucsx[0];
+begin
+  Utf8ToUnicode(@ucs, s, 2);
+  result := 1;
+  if ((ord(ucs) >= $1100) AND
+     ((ord(ucs) <= $115f) OR                    //* Hangul Jamo init. consonants */
+      (ord(ucs) = $2329) OR (ord(ucs) = $232a) OR
+      ((ord(ucs) >= $2e80) AND (ord(ucs) <= $a4cf) AND
+       (ord(ucs) <> $303f)) OR                  //* CJK ... Yi */
+      ((ord(ucs) >= $ac00) AND (ord(ucs) <= $d7a3)) OR //* Hangul Syllables */
+      ((ord(ucs) >= $f900) AND (ord(ucs) <= $faff)) OR //* CJK Compatibility Ideographs */
+      ((ord(ucs) >= $fe10) AND (ord(ucs) <= $fe19)) OR //* Vertical forms */
+      ((ord(ucs) >= $fe30) AND (ord(ucs) <= $fe6f)) OR //* CJK Compatibility Forms */
+      ((ord(ucs) >= $ff00) AND (ord(ucs) <= $ff60)) OR //* Fullwidth Forms */
+      ((ord(ucs) >= $ffe0) AND (ord(ucs) <= $ffe6)) OR
+      ((ord(ucs) >= $20000) AND (ord(ucs) <= $2fffd)) OR
+      ((ord(ucs) >= $30000) AND (ord(ucs) <= $3fffd))))
+  then result := 2;
+end;
+{$ENDIF}
 
+
 {$IFDEF SYN_LAZARUS}
 const
   fSynEditClipboardFormat: TClipboardFormat = 0;
@@ -3273,10 +3298,17 @@
     SpaceCount: Integer;
     CharLen: Integer;
     Special: boolean;
+{$IFDEF DoubleChrWidthHack}
+    dw : integer;
+{$ENDIF}
   begin
     TabCount:=0;
     for i:=0 to Count-1 do
+{$IFDEF DoubleChrWidthHack}
+      if (p[i]=#9) or (UseUTF8 and (ChrDispWidth(@p[i]) = 2)) then inc(TabCount);
+{$ELSE}
       if p[i]=#9 then inc(TabCount);
+{$ENDIF}
     Special:=eoShowSpecialChars in Options;
     if (not Special) and (TabCount=0)
     and (FindInvalidUTF8Character(p,Count)<0) then
@@ -3293,6 +3325,9 @@
     if UseUTF8 then begin
       while SrcPos<Count do begin
         c:=p[SrcPos];
+{$IFDEF DoubleChrWidthHack}
+        dw := ChrDispWidth(@p[SrcPos]);
+{$ENDIF}
         case c of
         #128..#191:
           begin
@@ -3374,6 +3409,14 @@
             inc(ScreenPos);
           end;
         end;
+{$IFDEF DoubleChrWidthHack}
+        if dw = 2 then begin
+            // normal char
+            Dest[DestPos]:= ' ';
+            inc(DestPos);
+            inc(ScreenPos);
+          end;
+{$ENDIF}
       end;
     end else begin
       // non UTF-8
@@ -10909,6 +10952,9 @@
       for i := 1 to p.x - 1 do begin
         if (i <= l) and (s[i] = #9) then
           inc(x, TabWidth - (x mod TabWidth))
+{$IFDEF DoubleChrWidthHack}
+      else if (ChrDispWidth(@s[i]) = 2) then inc(x,2)
+{$ENDIF}
         else
           inc(x);
       end;
@@ -10943,6 +10989,9 @@
         inc(ScreenPos, TabWidth - ((ScreenPos-1) mod TabWidth));
         inc(BytePos);
       end else begin
+{$IFDEF DoubleChrWidthHack}
+       if UseUTF8 and (ChrDispWidth(@Line[BytePos-1]) = 2) then inc(ScreenPos);
+{$ENDIF}
         inc(ScreenPos);
         if UseUTF8 then
           inc(BytePos,UTF8CharacterLength(@Line[BytePos-1]))
@@ -10990,15 +11039,27 @@
   BytePos, ByteLen: integer;
   ScreenPos: integer;
   PLine: PChar;
+{$IFDEF DoubleChrWidthHack}
+  prev  : integer;
+{$ENDIF}
 begin
   ByteLen := Length(Line);
   ScreenPos := StartPhysicalPos;
   BytePos := StartBytePos;
+{$IFDEF DoubleChrWidthHack}
+    prev  := BytePos;
+{$ENDIF}
   PLine := PChar(Line);
   // map utf and tab chars
   while ScreenPos < PhysicalPos do begin
+{$IFDEF DoubleChrWidthHack}
+    prev  := BytePos;
+{$ENDIF}
     if (BytePos <= ByteLen) then begin
       if (PLine[BytePos-1] <> #9) then begin
+{$IFDEF DoubleChrWidthHack}
+       if UseUTF8 and (ChrDispWidth(@PLine[BytePos-1]) = 2) then inc(ScreenPos);
+{$ENDIF}
         inc(ScreenPos);
         if UseUTF8 then
           inc(BytePos,UTF8CharacterLength(@PLine[BytePos-1]))
@@ -11014,7 +11075,13 @@
       break;
     end;
   end;
+{$IFDEF DoubleChrWidthHack}
   if (ScreenPos>PhysicalPos) and (BytePos>1) and (BytePos<ByteLen)
+  and UseUTF8 and (ChrDispWidth(@PLine[BytePos-2]) = 2) then
+    BytePos := prev
+  else
+{$ENDIF}
+  if (ScreenPos>PhysicalPos) and (BytePos>1) and (BytePos<ByteLen)
   and (PLine[BytePos-2]=#9) then
     dec(BytePos);
   Result := BytePos;