/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project .
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License , v . 2 . 0 . If a copy of the MPL was not distributed with this
* file , You can obtain one at http : //mozilla.org/MPL/2.0/.
*/
#include <sal/config.h>
#include <rtl/textcvt.h>
#include <sal/types.h>
#include "convertsimple.hxx"
#include "handleundefinedunicodetotextchar.hxx"
#include "tenchelp.hxx"
#define IMPL_MAX_REPLACECHAR 5
namespace {
struct ImplReplaceCharData
{
sal_uInt16 mnUniChar;
sal_uInt16 mnReplaceChar;
};
ImplReplaceCharData const aImplRepCharTab[] =
{
{ 0 x00A0, 0 x0020 }, /* NO-BREAK-SPACE */
{ 0 x00A1, 0 x0021 }, /* INVERTED EXCLAMATION MARK */
{ 0 x00B7, 0 x0045 }, /* MIDDLE DOT */
{ 0 x00BF, 0 x003F }, /* INVERTED QUESTION MARK */
{ 0 x00D7, 0 x002A }, /* MULTIPLICATION SIGN */
{ 0 x00F7, 0 x002F }, /* DIVISION SIGN */
{ 0 x2000, 0 x0020 }, /* EN QUAD */
{ 0 x2001, 0 x0020 }, /* EM QUAD */
{ 0 x2002, 0 x0020 }, /* EN SPACE */
{ 0 x2003, 0 x0020 }, /* EM SPACE */
{ 0 x2004, 0 x0020 }, /* THREE-PER-EM SPACE */
{ 0 x2005, 0 x0020 }, /* FOUR-PER-EM SPACE */
{ 0 x2006, 0 x0020 }, /* SIX-PER-EM SPACE */
{ 0 x2007, 0 x0020 }, /* FIGURE SPACE */
{ 0 x2008, 0 x0020 }, /* PUNCTUATION SPACE */
{ 0 x2009, 0 x0020 }, /* THIN SPACE */
{ 0 x200A, 0 x0020 }, /* HAIR SPACE */
{ 0 x2010, 0 x002D }, /* HYPHEN */
{ 0 x2011, 0 x002D }, /* NON-BREAKING HYPHEN */
{ 0 x2012, 0 x002D }, /* FIGURE DASH */
{ 0 x2013, 0 x002D }, /* EN DASH */
{ 0 x2014, 0 x002D }, /* EM DASH */
{ 0 x2015, 0 x002D }, /* HORIZONTAL BAR */
{ 0 x2018, 0 x0027 }, /* LEFT SINGLE QUOTATION MARK */
{ 0 x2019, 0 x0027 }, /* RIGHT SINGLE QUOTATION MARK */
{ 0 x201A, 0 x002C }, /* SINGLE LOW-9 QUOTATION MARK */
{ 0 x201B, 0 x0027 }, /* SINGLE HIGH-RESERVED-9 QUOTATION MARK */
{ 0 x201C, 0 x0022 }, /* LEFT DOUBLE QUOTATION MARK */
{ 0 x201D, 0 x0022 }, /* RIGHT DOUBLE QUOTATION MARK */
{ 0 x201E, 0 x0022 }, /* DOUBLE LOW-9 QUOTATION MARK */
{ 0 x201F, 0 x0022 }, /* DOUBLE HIGH-RESERVED-9 QUOTATION MARK */
{ 0 x2022, 0 x002D }, /* BULLET */
{ 0 x2023, 0 x002D }, /* TRIANGULAR BULLET */
{ 0 x2024, 0 x002D }, /* ONE DOT LEADER */
{ 0 x2027, 0 x002D }, /* HYPHENATION POINT */
{ 0 x2028, 0 x000A }, /* LINE SEPARATOR */
{ 0 x2029, 0 x000D }, /* PARAGRAPH SEPARATOR */
{ 0 x2032, 0 x0027 }, /* PRIME */
{ 0 x2033, 0 x0022 }, /* DOUBLE PRIME */
{ 0 x2035, 0 x0027 }, /* RESERVED PRIME */
{ 0 x2036, 0 x0022 }, /* RESERVED DOUBLE PRIME */
{ 0 x2039, 0 x003C }, /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */
{ 0 x203A, 0 x003E }, /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */
{ 0 x2043, 0 x002D }, /* HYPHEN BULLET */
{ 0 x2044, 0 x002F }, /* FRACTION SLASH */
{ 0 x2160, 0 x0049 }, /* ROMAN NUMERAL ONE */
{ 0 x2164, 0 x0056 }, /* ROMAN NUMERAL FIVE */
{ 0 x2169, 0 x0058 }, /* ROMAN NUMERAL TEN */
{ 0 x216C, 0 x004C }, /* ROMAN NUMERAL FIFTY */
{ 0 x216D, 0 x0043 }, /* ROMAN NUMERAL ONE HUNDRED */
{ 0 x216E, 0 x0044 }, /* ROMAN NUMERAL FIVE HUNDRED */
{ 0 x216F, 0 x004D }, /* ROMAN NUMERAL ONE THOUSAND */
{ 0 x2170, 0 x0069 }, /* SMALL ROMAN NUMERAL ONE */
{ 0 x2174, 0 x0076 }, /* SMALL ROMAN NUMERAL FIVE */
{ 0 x2179, 0 x0078 }, /* SMALL ROMAN NUMERAL TEN */
{ 0 x217C, 0 x006C }, /* SMALL ROMAN NUMERAL FIFTY */
{ 0 x217D, 0 x0063 }, /* SMALL ROMAN NUMERAL ONE HUNDRED */
{ 0 x217E, 0 x0064 }, /* SMALL ROMAN NUMERAL FIVE HUNDRED */
{ 0 x217F, 0 x006D }, /* SMALL ROMAN NUMERAL ONE THOUSAND */
{ 0 x2215, 0 x002F }, /* DIVISION SLASH */
{ 0 x2217, 0 x002A }, /* ASTERISK OPERATOR */
{ 0 xFF00, 0 x0020 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF01, 0 x0021 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF02, 0 x0022 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF03, 0 x0023 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF04, 0 x0024 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF05, 0 x0025 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF06, 0 x0026 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF07, 0 x0027 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF08, 0 x0028 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF09, 0 x0029 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF0A, 0 x002A }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF0B, 0 x002B }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF0C, 0 x002C }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF0D, 0 x002D }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF0E, 0 x002E }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF0F, 0 x002F }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF10, 0 x0030 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF11, 0 x0031 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF12, 0 x0032 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF13, 0 x0033 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF14, 0 x0034 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF15, 0 x0035 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF16, 0 x0036 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF17, 0 x0037 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF18, 0 x0038 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF19, 0 x0039 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF1A, 0 x003A }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF1B, 0 x003B }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF1C, 0 x003C }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF1D, 0 x003D }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF1E, 0 x003E }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF1F, 0 x003F }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF20, 0 x0040 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF21, 0 x0041 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF22, 0 x0042 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF23, 0 x0043 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF24, 0 x0044 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF25, 0 x0045 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF26, 0 x0046 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF27, 0 x0047 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF28, 0 x0048 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF29, 0 x0049 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF2A, 0 x004A }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF2B, 0 x004B }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF2C, 0 x004C }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF2D, 0 x004D }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF2E, 0 x004E }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF2F, 0 x004F }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF30, 0 x0050 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF31, 0 x0051 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF32, 0 x0052 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF33, 0 x0053 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF34, 0 x0054 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF35, 0 x0055 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF36, 0 x0056 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF37, 0 x0057 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF38, 0 x0058 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF39, 0 x0059 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF3A, 0 x005A }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF3B, 0 x005B }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF3C, 0 x005C }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF3D, 0 x005D }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF3E, 0 x005E }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF3F, 0 x005F }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF40, 0 x0060 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF41, 0 x0061 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF42, 0 x0062 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF43, 0 x0063 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF44, 0 x0064 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF45, 0 x0065 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF46, 0 x0066 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF47, 0 x0067 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF48, 0 x0068 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF49, 0 x0069 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF4A, 0 x006A }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF4B, 0 x006B }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF4C, 0 x006C }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF4D, 0 x006D }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF4E, 0 x006E }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF4F, 0 x006F }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF50, 0 x0070 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF51, 0 x0071 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF52, 0 x0072 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF53, 0 x0073 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF54, 0 x0074 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF55, 0 x0075 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF56, 0 x0076 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF57, 0 x0077 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF58, 0 x0078 }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF59, 0 x0079 }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF5A, 0 x007A }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF5B, 0 x007B }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF5C, 0 x007C }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF5D, 0 x007D }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF5E, 0 x007E }, /* FULLWIDTH ASCII FORMS*/
{ 0 xFF5F, 0 x007F }, /* FULLWIDTH ASCII FORMS */
{ 0 xFF61, 0 x3002 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF62, 0 x300C }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF63, 0 x300D }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF64, 0 x3001 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF65, 0 x30FB }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF66, 0 x30F2 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF67, 0 x30A1 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF68, 0 x30A3 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF69, 0 x30A5 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF6A, 0 x30A7 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF6B, 0 x30A9 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF6C, 0 x30E3 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF6D, 0 x30E5 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF6E, 0 x30E7 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF6F, 0 x30C3 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF70, 0 x30FC }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF71, 0 x30A2 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF72, 0 x30A4 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF73, 0 x30A6 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF74, 0 x30A8 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF75, 0 x30AA }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF76, 0 x30AB }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF77, 0 x30AD }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF78, 0 x30AF }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF79, 0 x30B1 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF7A, 0 x30B3 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF7B, 0 x30B5 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF7C, 0 x30B7 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF7D, 0 x30B9 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF7E, 0 x30BB }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF7F, 0 x30BD }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF80, 0 x30BF }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF81, 0 x30C1 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF82, 0 x30C4 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF83, 0 x30C6 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF84, 0 x30C8 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF85, 0 x30CA }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF86, 0 x30CB }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF87, 0 x30CC }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF88, 0 x30CD }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF89, 0 x30CE }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF8A, 0 x30CF }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF8B, 0 x30D2 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF8C, 0 x30D5 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF8D, 0 x30D8 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF8E, 0 x30DB }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF8F, 0 x30DE }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF90, 0 x30DF }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF91, 0 x30E0 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF92, 0 x30E1 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF93, 0 x30E2 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF94, 0 x30E4 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF95, 0 x30E6 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF96, 0 x30E8 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF97, 0 x30E9 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF98, 0 x30EA }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF99, 0 x30EB }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF9A, 0 x30EC }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF9B, 0 x30ED }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF9C, 0 x30EF }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF9D, 0 x30F3 }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF9E, 0 x309B }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFF9F, 0 x309C }, /* HALFWIDTH KATAKANA FORMS */
{ 0 xFFA0, 0 x3164 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFA1, 0 x3131 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFA2, 0 x3132 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFA3, 0 x3133 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFA4, 0 x3134 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFA5, 0 x3135 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFA6, 0 x3136 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFA7, 0 x3137 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFA8, 0 x3138 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFA9, 0 x3139 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFAA, 0 x313A }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFAB, 0 x313B }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFAC, 0 x313C }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFAD, 0 x313D }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFAE, 0 x313E }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFAF, 0 x313F }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFB0, 0 x3140 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFB1, 0 x3141 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFB2, 0 x3142 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFB3, 0 x3143 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFB4, 0 x3144 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFB5, 0 x3145 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFB6, 0 x3146 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFB7, 0 x3147 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFB8, 0 x3148 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFB9, 0 x3149 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFBA, 0 x314A }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFBB, 0 x314B }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFBC, 0 x314C }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFBD, 0 x314D }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFBE, 0 x314E }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFC2, 0 x314F }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFC3, 0 x3150 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFC4, 0 x3151 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFC5, 0 x3152 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFC6, 0 x3153 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFC7, 0 x3154 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFCA, 0 x3155 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFCB, 0 x3156 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFCC, 0 x3157 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFCD, 0 x3158 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFCE, 0 x3159 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFCF, 0 x315A }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFD2, 0 x315B }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFD3, 0 x315C }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFD4, 0 x315D }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFD5, 0 x315E }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFD6, 0 x315F }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFD7, 0 x3160 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFDA, 0 x3161 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFDB, 0 x3162 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFDC, 0 x3163 }, /* HALFWIDTH HANGUL FORMS */
{ 0 xFFE0, 0 x00A2 }, /* FULLWIDTH CENT SIGN */
{ 0 xFFE1, 0 x00A3 }, /* FULLWIDTH POUND SIGN */
{ 0 xFFE2, 0 x00AC }, /* FULLWIDTH NOT SIGN */
{ 0 xFFE3, 0 x00AF }, /* FULLWIDTH MACRON */
{ 0 xFFE4, 0 x00A6 }, /* FULLWIDTH BROKEN BAR */
{ 0 xFFE5, 0 x00A5 }, /* FULLWIDTH YEN SIGN */
{ 0 xFFE6, 0 x20A9 }, /* FULLWIDTH WON SIGN */
{ 0 xFFE8, 0 x2502 }, /* HALFWIDTH FORMS LIGHT VERTICAL */
{ 0 xFFE9, 0 x2190 }, /* HALFWIDTH LEFTWARDS ARROW */
{ 0 xFFEA, 0 x2191 }, /* HALFWIDTH UPWARDS ARROW */
{ 0 xFFEB, 0 x2192 }, /* HALFWIDTH RIGHTWARDS ARROW */
{ 0 xFFEC, 0 x2193 }, /* HALFWIDTH DOWNWARDS ARROW */
{ 0 xFFED, 0 x25A0 }, /* HALFWIDTH BLACK SQUARE */
{ 0 xFFEE, 0 x25CB }, /* HALFWIDTH WHITE CIRCLE */
{ 0 xFFFD, 0 x003F } /* REPLACEMENT CHARACTER */
};
sal_uInt16 ImplGetReplaceChar( sal_Unicode c )
{
sal_uInt16 nLow;
sal_uInt16 nHigh;
sal_uInt16 nMid;
sal_uInt16 nCompareChar;
const ImplReplaceCharData* pCharData;
nLow = 0 ;
nHigh = SAL_N_ELEMENTS( aImplRepCharTab ) - 1 ;
do
{
nMid = (nLow+nHigh)/2 ;
pCharData = aImplRepCharTab+nMid;
nCompareChar = pCharData->mnUniChar;
if ( c < nCompareChar )
{
if ( !nMid )
break ;
nHigh = nMid-1 ;
}
else
{
if ( c > nCompareChar )
nLow = nMid+1 ;
else
return pCharData->mnReplaceChar;
}
}
while ( nLow <= nHigh );
return 0 ;
}
struct ImplReplaceCharStrData
{
sal_uInt16 mnUniChar;
sal_uInt16 maReplaceChars[IMPL_MAX_REPLACECHAR];
};
ImplReplaceCharStrData const aImplRepCharStrTab[] =
{
{ 0 x00A9, { 0 x0028, 0 x0063, 0 x0029, 0 x0000, 0 x0000 } }, /* COPYRIGHT SIGN */
{ 0 x00AB, { 0 x003C, 0 x003C, 0 x0000, 0 x0000, 0 x0000 } }, /* LEFT-POINTING-DOUBLE ANGLE QUOTATION MARK */
{ 0 x0AE0, { 0 x0028, 0 x0072, 0 x0029, 0 x0000, 0 x0000 } }, /* REGISTERED SIGN */
{ 0 x00BB, { 0 x003E, 0 x003E, 0 x0000, 0 x0000, 0 x0000 } }, /* RIGHT-POINTING-DOUBLE ANGLE QUOTATION MARK */
{ 0 x00BC, { 0 x0031, 0 x002F, 0 x0034, 0 x0000, 0 x0000 } }, /* VULGAR FRACTION ONE QUARTER */
{ 0 x00BD, { 0 x0031, 0 x002F, 0 x0032, 0 x0000, 0 x0000 } }, /* VULGAR FRACTION ONE HALF */
{ 0 x00BE, { 0 x0033, 0 x002F, 0 x0034, 0 x0000, 0 x0000 } }, /* VULGAR FRACTION THREE QUARTERS */
{ 0 x00C6, { 0 x0041, 0 x0045, 0 x0000, 0 x0000, 0 x0000 } }, /* LATIN CAPITAL LETTER AE */
{ 0 x00E6, { 0 x0061, 0 x0065, 0 x0000, 0 x0000, 0 x0000 } }, /* LATIN SMALL LETTER AE */
{ 0 x0152, { 0 x004F, 0 x0045, 0 x0000, 0 x0000, 0 x0000 } }, /* LATIN CAPITAL LIGATURE OE */
{ 0 x0153, { 0 x006F, 0 x0065, 0 x0000, 0 x0000, 0 x0000 } }, /* LATIN SMALL LIGATURE OE */
{ 0 x2025, { 0 x002E, 0 x002E, 0 x0000, 0 x0000, 0 x0000 } }, /* TWO DOT LEADER */
{ 0 x2026, { 0 x002E, 0 x002E, 0 x002E, 0 x0000, 0 x0000 } }, /* HORIZONTAL ELLIPSES */
{ 0 x2034, { 0 x0027, 0 x0027, 0 x0027, 0 x0000, 0 x0000 } }, /* TRIPLE PRIME */
{ 0 x2037, { 0 x0027, 0 x0027, 0 x0027, 0 x0000, 0 x0000 } }, /* REVERSED TRIPLE PRIME */
{ 0 x20AC, { 0 x0045, 0 x0055, 0 x0052, 0 x0000, 0 x0000 } }, /* EURO SIGN */
{ 0 x2122, { 0 x0028, 0 x0074, 0 x006D, 0 x0029, 0 x0000 } }, /* TRADE MARK SIGN */
{ 0 x2153, { 0 x0031, 0 x002F, 0 x0033, 0 x0000, 0 x0000 } }, /* VULGAR FRACTION ONE THIRD */
{ 0 x2154, { 0 x0032, 0 x002F, 0 x0033, 0 x0000, 0 x0000 } }, /* VULGAR FRACTION TWO THIRD */
{ 0 x2155, { 0 x0031, 0 x002F, 0 x0035, 0 x0000, 0 x0000 } }, /* VULGAR FRACTION ONE FIFTH */
{ 0 x2156, { 0 x0032, 0 x002F, 0 x0035, 0 x0000, 0 x0000 } }, /* VULGAR FRACTION TWO FIFTH */
{ 0 x2157, { 0 x0033, 0 x002F, 0 x0035, 0 x0000, 0 x0000 } }, /* VULGAR FRACTION THREE FIFTH */
{ 0 x2158, { 0 x0034, 0 x002F, 0 x0035, 0 x0000, 0 x0000 } }, /* VULGAR FRACTION FOUR FIFTH */
{ 0 x2159, { 0 x0031, 0 x002F, 0 x0036, 0 x0000, 0 x0000 } }, /* VULGAR FRACTION ONE SIXTH */
{ 0 x215A, { 0 x0035, 0 x002F, 0 x0036, 0 x0000, 0 x0000 } }, /* VULGAR FRACTION FIVE SIXTH */
{ 0 x215B, { 0 x0031, 0 x002F, 0 x0038, 0 x0000, 0 x0000 } }, /* VULGAR FRACTION ONE EIGHTH */
{ 0 x215C, { 0 x0033, 0 x002F, 0 x0038, 0 x0000, 0 x0000 } }, /* VULGAR FRACTION THREE EIGHTH */
{ 0 x215D, { 0 x0035, 0 x002F, 0 x0038, 0 x0000, 0 x0000 } }, /* VULGAR FRACTION FIVE EIGHTH */
{ 0 x215E, { 0 x0037, 0 x002F, 0 x0038, 0 x0000, 0 x0000 } }, /* VULGAR FRACTION SEVEN EIGHTH */
{ 0 x215F, { 0 x0031, 0 x002F, 0 x0000, 0 x0000, 0 x0000 } }, /* FRACTION NUMERATOR ONE */
{ 0 x2161, { 0 x0049, 0 x0049, 0 x0000, 0 x0000, 0 x0000 } }, /* ROMAN NUMERAL TWO */
{ 0 x2162, { 0 x0049, 0 x0049, 0 x0049, 0 x0000, 0 x0000 } }, /* ROMAN NUMERAL THREE */
{ 0 x2163, { 0 x0049, 0 x0056, 0 x0000, 0 x0000, 0 x0000 } }, /* ROMAN NUMERAL FOUR */
{ 0 x2165, { 0 x0056, 0 x0049, 0 x0000, 0 x0000, 0 x0000 } }, /* ROMAN NUMERAL SIX */
{ 0 x2166, { 0 x0056, 0 x0049, 0 x0049, 0 x0000, 0 x0000 } }, /* ROMAN NUMERAL SEVEN */
{ 0 x2168, { 0 x0056, 0 x0049, 0 x0049, 0 x0049, 0 x0000 } }, /* ROMAN NUMERAL EIGHT */
{ 0 x2169, { 0 x0049, 0 x0058, 0 x0000, 0 x0000, 0 x0000 } }, /* ROMAN NUMERAL NINE */
{ 0 x216A, { 0 x0058, 0 x0049, 0 x0000, 0 x0000, 0 x0000 } }, /* ROMAN NUMERAL ELEVEN */
{ 0 x216B, { 0 x0058, 0 x0049, 0 x0049, 0 x0000, 0 x0000 } }, /* ROMAN NUMERAL TWELVE */
{ 0 x2171, { 0 x0069, 0 x0069, 0 x0000, 0 x0000, 0 x0000 } }, /* SMALL ROMAN NUMERAL TWO */
{ 0 x2172, { 0 x0069, 0 x0069, 0 x0069, 0 x0000, 0 x0000 } }, /* SMALL ROMAN NUMERAL THREE */
{ 0 x2173, { 0 x0069, 0 x0076, 0 x0000, 0 x0000, 0 x0000 } }, /* SMALL ROMAN NUMERAL FOUR */
{ 0 x2175, { 0 x0076, 0 x0069, 0 x0000, 0 x0000, 0 x0000 } }, /* SMALL ROMAN NUMERAL SIX */
{ 0 x2176, { 0 x0076, 0 x0069, 0 x0069, 0 x0000, 0 x0000 } }, /* SMALL ROMAN NUMERAL SEVEN */
{ 0 x2178, { 0 x0076, 0 x0069, 0 x0069, 0 x0069, 0 x0000 } }, /* SMALL ROMAN NUMERAL EIGHT */
{ 0 x2179, { 0 x0069, 0 x0078, 0 x0000, 0 x0000, 0 x0000 } }, /* SMALL ROMAN NUMERAL NINE */
{ 0 x217A, { 0 x0078, 0 x0069, 0 x0000, 0 x0000, 0 x0000 } }, /* SMALL ROMAN NUMERAL ELEVEN */
{ 0 x217B, { 0 x0058, 0 x0069, 0 x0069, 0 x0000, 0 x0000 } } /* SMALL ROMAN NUMERAL TWELVE */
};
const sal_uInt16* ImplGetReplaceString( sal_Unicode c )
{
sal_uInt16 nLow;
sal_uInt16 nHigh;
sal_uInt16 nMid;
sal_uInt16 nCompareChar;
const ImplReplaceCharStrData* pCharData;
nLow = 0 ;
nHigh = SAL_N_ELEMENTS( aImplRepCharStrTab ) - 1 ;
do
{
nMid = (nLow+nHigh)/2 ;
pCharData = aImplRepCharStrTab+nMid;
nCompareChar = pCharData->mnUniChar;
if ( c < nCompareChar )
{
if ( !nMid )
break ;
nHigh = nMid-1 ;
}
else
{
if ( c > nCompareChar )
nLow = nMid+1 ;
else
return pCharData->maReplaceChars;
}
}
while ( nLow <= nHigh );
return nullptr;
}
// Writes 0--2 characters to dest:
int ImplConvertUnicodeCharToChar(
const ImplByteConvertData* pConvertData, sal_Unicode c, char * dest )
{
const ImplUniCharTabData* pToCharExTab;
if ( c < 0 x80 )
{
dest[0 ] = static_cast < char >(c);
return 1 ;
}
if ( (c >= pConvertData->mnToCharStart1) && (c <= pConvertData->mnToCharEnd1) )
{
dest[0 ] = static_cast < char >(pConvertData->mpToCharTab1[c-pConvertData->mnToCharStart1]);
if ( dest[0 ] != 0 )
return 1 ;
}
else if ( (c >= pConvertData->mnToCharStart2) && (c <= pConvertData->mnToCharEnd2) )
{
dest[0 ] = static_cast < char >(pConvertData->mpToCharTab2[c-pConvertData->mnToCharStart2]);
if ( dest[0 ] != 0 )
return 1 ;
}
pToCharExTab = pConvertData->mpToCharExTab;
if ( pToCharExTab )
{
sal_uInt16 nLow;
sal_uInt16 nHigh;
sal_uInt16 nMid;
sal_uInt16 nCompareChar;
const ImplUniCharTabData* pCharExData;
nLow = 0 ;
nHigh = pConvertData->mnToCharExCount-1 ;
do
{
nMid = (nLow+nHigh)/2 ;
pCharExData = pToCharExTab+nMid;
nCompareChar = pCharExData->mnUniChar;
if ( c < nCompareChar )
{
if ( !nMid )
break ;
nHigh = nMid-1 ;
}
else
{
if ( c > nCompareChar )
nLow = nMid+1 ;
else
{
dest[0 ] = static_cast < char >(pCharExData->mnChar);
if ( pCharExData->mnChar2 == 0 )
return 1 ;
dest[1 ] = static_cast < char >(pCharExData->mnChar2);
return 2 ;
}
}
}
while ( nLow <= nHigh );
}
return 0 ;
}
}
sal_Size sal::detail::textenc::convertCharToUnicode(
void const * pData, SAL_UNUSED_PARAMETER void *, char const * pSrcBuf,
sal_Size nSrcBytes, sal_Unicode * pDestBuf, sal_Size nDestChars,
sal_uInt32 nFlags, sal_uInt32 * pInfo, sal_Size * pSrcCvtBytes)
{
sal_Unicode cConv;
const ImplByteConvertData* pConvertData = static_cast <const ImplByteConvertData*>(pData);
sal_Unicode* pEndDestBuf;
const char * pEndSrcBuf;
*pInfo = 0 ;
pEndDestBuf = pDestBuf+nDestChars;
pEndSrcBuf = pSrcBuf+nSrcBytes;
while ( pSrcBuf < pEndSrcBuf )
{
unsigned char c = static_cast <unsigned char >(*pSrcBuf);
if ( c < 0 x80 )
cConv = c;
else
{
if ( (c >= pConvertData->mnToUniStart1) && (c <= pConvertData->mnToUniEnd1) )
cConv = pConvertData->mpToUniTab1[c-pConvertData->mnToUniStart1];
else if ( (c >= pConvertData->mnToUniStart2) && (c <= pConvertData->mnToUniEnd2) )
cConv = pConvertData->mpToUniTab2[c-pConvertData->mnToUniStart2];
else
cConv = 0 ;
if ( !cConv )
{
*pInfo |= RTL_TEXTTOUNICODE_INFO_UNDEFINED;
if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR )
{
if ((nFlags & RTL_TEXTTOUNICODE_FLAGS_FLUSH) == 0 ) {
++pSrcBuf;
}
*pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR;
break ;
}
if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_IGNORE )
{
pSrcBuf++;
continue ;
}
cConv = ImplGetUndefinedUnicodeChar(c, nFlags);
}
}
if ( pDestBuf == pEndDestBuf )
{
*pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOOSMALL;
break ;
}
*pDestBuf = cConv;
pDestBuf++;
pSrcBuf++;
}
*pSrcCvtBytes = nSrcBytes - (pEndSrcBuf-pSrcBuf);
return (nDestChars - (pEndDestBuf-pDestBuf));
}
sal_Size sal::detail::textenc::convertUnicodeToChar(
void const * pData, SAL_UNUSED_PARAMETER void *,
sal_Unicode const * pSrcBuf, sal_Size nSrcChars, char * pDestBuf,
sal_Size nDestBytes, sal_uInt32 nFlags, sal_uInt32 * pInfo,
sal_Size * pSrcCvtChars)
{
sal_Unicode c;
const ImplByteConvertData* pConvertData = static_cast <const ImplByteConvertData*>(pData);
char * pEndDestBuf;
const sal_Unicode* pEndSrcBuf;
int i;
int n;
sal_uInt16 cTemp;
char aTempBuf[IMPL_MAX_REPLACECHAR+2 ];
const sal_uInt16* pReplace;
*pInfo = 0 ;
pEndDestBuf = pDestBuf+nDestBytes;
pEndSrcBuf = pSrcBuf+nSrcChars;
while ( pSrcBuf < pEndSrcBuf )
{
c = *pSrcBuf;
if ( c < 0 x80 )
{
aTempBuf[0 ] = static_cast < char >(c);
n = 1 ;
}
else
{
n = ImplConvertUnicodeCharToChar( pConvertData, c, aTempBuf );
if ( n == 0 )
{
if ( nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE )
{
cTemp = ImplGetReplaceChar( c );
if ( cTemp )
n = ImplConvertUnicodeCharToChar(
pConvertData, cTemp, aTempBuf );
}
if ( n == 0 )
{
if ( nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACESTR )
{
pReplace = ImplGetReplaceString( c );
if ( pReplace )
{
while ( *pReplace && (n < IMPL_MAX_REPLACECHAR) )
{
i = ImplConvertUnicodeCharToChar(
pConvertData, *pReplace, aTempBuf + n );
if ( i == 0 )
{
n = 0 ;
break ;
}
pReplace++;
n += i;
}
}
}
/* Handle undefined and surrogates characters */
/* (all surrogates characters are undefined) */
if ( n == 0 )
{
if (sal::detail::textenc::handleUndefinedUnicodeToTextChar(
&pSrcBuf, pEndSrcBuf, &pDestBuf, pEndDestBuf,
nFlags, pInfo))
continue ;
break ;
}
}
}
}
if ( pEndDestBuf - pDestBuf < n )
{
*pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
break ;
}
for ( i = 0 ; i < n; ++i )
*pDestBuf++ = aTempBuf[i];
pSrcBuf++;
}
*pSrcCvtChars = nSrcChars - (pEndSrcBuf-pSrcBuf);
return (nDestBytes - (pEndDestBuf-pDestBuf));
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Messung V0.5 in Prozent C=49 H=85 G=69
¤ Dauer der Verarbeitung: 0.17 Sekunden
(vorverarbeitet am 2026-09-29)
¤
*© Formatika GbR, Deutschland