                  // create and add new word
                  formatted_word_t * word = lvtextAddFormattedWord(frmline);
                  int b;
-@@ -811,7 +811,8 @@ public:
+@@ -811,7 +811,9 @@ public:
                          }
                          if ( word->flags & LTEXT_WORD_CAN_HYPH_BREAK_LINE_AFTER ) {
                              word->width -= font->getHyphenWidth(); // TODO: strange fix - need some other solution
 -                        } else if ( lastc=='.' || lastc==',' || lastc=='!' || lastc==':'   || lastc==';' ) {
 +                        } else if ( lastc=='.' || lastc==',' || lastc=='!' || lastc==':'   || lastc==';' ||
-+                            lastc==L'。' || lastc==L'，' || lastc==L'！' || lastc==L'：' || lastc==L'；' || lastc==L'”') {
++                            lastc==L'。' || lastc==L'，' || lastc==L'！' || lastc==L'：' || lastc==L'；' ||
++                            lastc==L'”' || lastc==L'’' || lastc==L'」' || lastc==L'』' ) {
                              int w = font->getCharWidth(lastc);
                              TR("floating: %c w=%d", lastc, w);
                              word->width -= w;
-@@ -869,6 +870,29 @@ public:
+@@ -869,6 +871,29 @@ public:
          return 0;
      }
  

+            int upSkipCount = 0;
+            if (endp > 1 && isCJKLeftPunctuation(*(m_text + endp))) {
+				CRLog::trace("skip skip punctuation %s, at index %d", LCSTR(lString16(m_text+endp, 1)), endp);
+            } else if (endp > 1 && isCJKLeftPunctuation(*(m_text + endp -1))) {
+               endp--; wrapPos--;
+               CRLog::trace("up skip left punctuation %s, at index %d", LCSTR(lString16(m_text+endp, 1)), endp);
+            } else if (endp > 1 && (isCJKPunctuation(*(m_text + endp)))) {
+                for (int epos = endp; epos>=start; epos++, downSkipCount++) {
+                   if ( !isCJKPunctuation(*(m_text + epos)) ) break;
+                   CRLog::trace("down skip punctuation %s, at index %d", LCSTR(lString16(m_text + epos, 1)), epos);

         }
 #endif
 
@@ -944,6 +968,8 @@ public:
             int lastMandatoryWrap = -1;
             int spaceReduceWidth = 0; // max total line width which can be reduced by narrowing of spaces
             int firstCharMargin = getAdditionalCharWidthOnLeft(pos); // for first italic char with elements below baseline
