if PHP recode functions are used for decoding, they might use html character
authortokul <tokul@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Thu, 2 Mar 2006 20:31:31 +0000 (20:31 +0000)
committertokul <tokul@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Thu, 2 Mar 2006 20:31:31 +0000 (20:31 +0000)
entities. Encoding functions can't handle them. It is easier to convert all
entities in one place instead of finding supported entities in every encoding
function.

git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@10848 7612ce4b-ef26-0410-bec9-ea0150e637f0

functions/i18n.php

index a56f4f4..0d47e14 100644 (file)
@@ -244,6 +244,7 @@ function charset_encode($string,$charset,$htmlencode=true) {
  */
 function charset_convert($in_charset,$string,$out_charset,$htmlencode=true) {
     $string=charset_decode($in_charset,$string,true);
+    $string=sqi18n_convert_entities($string);
     $string=charset_encode($string,$out_charset,$htmlencode);
     return $string;
 }
@@ -588,79 +589,360 @@ endswitch;
  * @return bool is it possible to convert to user's charset
  */
 function is_conversion_safe($input_charset) {
-  global $languages, $sm_notAlias, $default_charset, $lossy_encoding;
+    global $languages, $sm_notAlias, $default_charset, $lossy_encoding;
 
     if (isset($lossy_encoding) && $lossy_encoding )
         return true;
 
- // convert to lower case
- $input_charset = strtolower($input_charset);
   // convert to lower case
   $input_charset = strtolower($input_charset);
 
- // Is user's locale Unicode based ?
- if ( $default_charset == "utf-8" ) {
-   return true;
- }
-
- // Charsets that are similar
-switch ($default_charset):
-case "windows-1251":
-      if ( $input_charset == "iso-8859-5" ||
-           $input_charset == "koi8-r" ||
-           $input_charset == "koi8-u" ) {
+    // Is user's locale Unicode based ?
+    if ( $default_charset == "utf-8" ) {
         return true;
-     } else {
+    }
+
+    // Charsets that are similar
+    switch ($default_charset) {
+    case "windows-1251":
+        if ( $input_charset == "iso-8859-5" ||
+             $input_charset == "koi8-r" ||
+             $input_charset == "koi8-u" ) {
+            return true;
+        } else {
+            return false;
+        }
+    case "windows-1257":
+        if ( $input_charset == "iso-8859-13" ||
+             $input_charset == "iso-8859-4" ) {
+            return true;
+        } else {
+            return false;
+        }
+    case "iso-8859-4":
+        if ( $input_charset == "iso-8859-13" ||
+             $input_charset == "windows-1257" ) {
+            return true;
+        } else {
+            return false;
+        }
+    case "iso-8859-5":
+        if ( $input_charset == "windows-1251" ||
+             $input_charset == "koi8-r" ||
+             $input_charset == "koi8-u" ) {
+            return true;
+        } else {
+            return false;
+        }
+    case "iso-8859-13":
+        if ( $input_charset == "iso-8859-4" ||
+             $input_charset == "windows-1257" ) {
+            return true;
+        } else {
+            return false;
+        }
+    case "koi8-r":
+        if ( $input_charset == "windows-1251" ||
+             $input_charset == "iso-8859-5" ||
+             $input_charset == "koi8-u" ) {
+            return true;
+        } else {
+            return false;
+        }
+    case "koi8-u":
+        if ( $input_charset == "windows-1251" ||
+             $input_charset == "iso-8859-5" ||
+             $input_charset == "koi8-r" ) {
+            return true;
+        } else {
+            return false;
+        }
+    default:
         return false;
-     }
-case "windows-1257":
-  if ( $input_charset == "iso-8859-13" ||
-       $input_charset == "iso-8859-4" ) {
-    return true;
-  } else {
-    return false;
-  }
-case "iso-8859-4":
-  if ( $input_charset == "iso-8859-13" ||
-       $input_charset == "windows-1257" ) {
-     return true;
-  } else {
-     return false;
-  }
-case "iso-8859-5":
-  if ( $input_charset == "windows-1251" ||
-       $input_charset == "koi8-r" ||
-       $input_charset == "koi8-u" ) {
-     return true;
-  } else {
-     return false;
-  }
-case "iso-8859-13":
-  if ( $input_charset == "iso-8859-4" ||
-       $input_charset == "windows-1257" ) {
-     return true;
-  } else {
-     return false;
-  }
-case "koi8-r":
-  if ( $input_charset == "windows-1251" ||
-       $input_charset == "iso-8859-5" ||
-       $input_charset == "koi8-u" ) {
-     return true;
-  } else {
-     return false;
-  }
-case "koi8-u":
-  if ( $input_charset == "windows-1251" ||
-       $input_charset == "iso-8859-5" ||
-       $input_charset == "koi8-r" ) {
-     return true;
-  } else {
-     return false;
-  }
-default:
-   return false;
-endswitch;
+    }
 }
 
+/**
+ * Converts html character entities to numeric entities
+ * 
+ * SquirrelMail encoding functions work only with numeric entities.
+ * This function fixes issues with decoding functions that might convert
+ * some symbols to character entities. Issue is specific to PHP recode 
+ * extension decoding. Function is used internally in charset_convert()
+ * function.
+ * @param string $str string that might contain html character entities
+ * @return string string with character entities converted to decimals. 
+ * @since 1.5.2
+ */
+function sqi18n_convert_entities($str) {
+
+    $entities = array(
+        // Latin 1
+        '&nbsp;'   => '&#160;',
+        '&iexcl;'  => '&#161;',
+        '&cent;'   => '&#162;',
+        '&pound;'  => '&#163;',
+        '&curren;' => '&#164;',
+        '&yen;'    => '&#165;',
+        '&brvbar;' => '&#166;',
+        '&sect;'   => '&#167;',
+        '&uml;'    => '&#168;',
+        '&copy;'   => '&#169;',
+        '&ordf;'   => '&#170;',
+        '&laquo;'  => '&#171;',
+        '&not;'    => '&#172;',
+        '&shy;'    => '&#173;',
+        '&reg;'    => '&#174;',
+        '&macr;'   => '&#175;',
+        '&deg;'    => '&#176;',
+        '&plusmn;' => '&#177;',
+        '&sup2;'   => '&#178;',
+        '&sup3;'   => '&#179;',
+        '&acute;'  => '&#180;',
+        '&micro;'  => '&#181;',
+        '&para;'   => '&#182;',
+        '&middot;' => '&#183;',
+        '&cedil;'  => '&#184;',
+        '&sup1;'   => '&#185;',
+        '&ordm;'   => '&#186;',
+        '&raquo;'  => '&#187;',
+        '&frac14;' => '&#188;',
+        '&frac12;' => '&#189;',
+        '&frac34;' => '&#190;',
+        '&iquest;' => '&#191;',
+        '&Agrave;' => '&#192;',
+        '&Aacute;' => '&#193;',
+        '&Acirc;'  => '&#194;',
+        '&Atilde;' => '&#195;',
+        '&Auml;'   => '&#196;',
+        '&Aring;'  => '&#197;',
+        '&AElig;'  => '&#198;',
+        '&Ccedil;' => '&#199;',
+        '&Egrave;' => '&#200;',
+        '&Eacute;' => '&#201;',
+        '&Ecirc;'  => '&#202;',
+        '&Euml;'   => '&#203;',
+        '&Igrave;' => '&#204;',
+        '&Iacute;' => '&#205;',
+        '&Icirc;'  => '&#206;',
+        '&Iuml;'   => '&#207;',
+        '&ETH;'    => '&#208;',
+        '&Ntilde;' => '&#209;',
+        '&Ograve;' => '&#210;',
+        '&Oacute;' => '&#211;',
+        '&Ocirc;'  => '&#212;',
+        '&Otilde;' => '&#213;',
+        '&Ouml;'   => '&#214;',
+        '&times;'  => '&#215;',
+        '&Oslash;' => '&#216;',
+        '&Ugrave;' => '&#217;',
+        '&Uacute;' => '&#218;',
+        '&Ucirc;'  => '&#219;',
+        '&Uuml;'   => '&#220;',
+        '&Yacute;' => '&#221;',
+        '&THORN;'  => '&#222;',
+        '&szlig;'  => '&#223;',
+        '&agrave;' => '&#224;',
+        '&aacute;' => '&#225;',
+        '&acirc;'  => '&#226;',
+        '&atilde;' => '&#227;',
+        '&auml;'   => '&#228;',
+        '&aring;'  => '&#229;',
+        '&aelig;'  => '&#230;',
+        '&ccedil;' => '&#231;',
+        '&egrave;' => '&#232;',
+        '&eacute;' => '&#233;',
+        '&ecirc;'  => '&#234;',
+        '&euml;'   => '&#235;',
+        '&igrave;' => '&#236;',
+        '&iacute;' => '&#237;',
+        '&icirc;'  => '&#238;',
+        '&iuml;'   => '&#239;',
+        '&eth;'    => '&#240;',
+        '&ntilde;' => '&#241;',
+        '&ograve;' => '&#242;',
+        '&oacute;' => '&#243;',
+        '&ocirc;'  => '&#244;',
+        '&otilde;' => '&#245;',
+        '&ouml;'   => '&#246;',
+        '&divide;' => '&#247;',
+        '&oslash;' => '&#248;',
+        '&ugrave;' => '&#249;',
+        '&uacute;' => '&#250;',
+        '&ucirc;'  => '&#251;',
+        '&uuml;'   => '&#252;',
+        '&yacute;' => '&#253;',
+        '&thorn;'  => '&#254;',
+        '&yuml;'   => '&#255;',
+        // Latin Extended-A
+        '&OElig;'  => '&#338;',
+        '&oelig;'  => '&#339;',
+        '&Scaron;' => '&#352;',
+        '&scaron;' => '&#353;',
+        '&Yuml;'   => '&#376;',
+        // Spacing Modifier Letters
+        '&circ;'   => '&#710;',
+        '&tilde;'  => '&#732;',
+        // General Punctuation
+        '&ensp;'   => '&#8194;',
+        '&emsp;'   => '&#8195;',
+        '&thinsp;' => '&#8201;',
+        '&zwnj;'   => '&#8204;',
+        '&zwj;'    => '&#8205;',
+        '&lrm;'    => '&#8206;',
+        '&rlm;'    => '&#8207;',
+        '&ndash;'  => '&#8211;',
+        '&mdash;'  => '&#8212;',
+        '&lsquo;'  => '&#8216;',
+        '&rsquo;'  => '&#8217;',
+        '&sbquo;'  => '&#8218;',
+        '&ldquo;'  => '&#8220;',
+        '&rdquo;'  => '&#8221;',
+        '&bdquo;'  => '&#8222;',
+        '&dagger;' => '&#8224;',
+        '&Dagger;' => '&#8225;',
+        '&permil;' => '&#8240;',
+        '&lsaquo;' => '&#8249;',
+        '&rsaquo;' => '&#8250;',
+        '&euro;'   => '&#8364;',
+        // Latin Extended-B
+        '&fnof;' => '&#402;',
+        // Greek
+        '&Alpha;'  => '&#913;',
+        '&Beta;'   => '&#914;',
+        '&Gamma;'  => '&#915;',
+        '&Delta;'  => '&#916;',
+        '&Epsilon;' => '&#917;',
+        '&Zeta;'   => '&#918;',
+        '&Eta;'    => '&#919;',
+        '&Theta;'  => '&#920;',
+        '&Iota;'   => '&#921;',
+        '&Kappa;'  => '&#922;',
+        '&Lambda;' => '&#923;',
+        '&Mu;'     => '&#924;',
+        '&Nu;'     => '&#925;',
+        '&Xi;'     => '&#926;',
+        '&Omicron;' => '&#927;',
+        '&Pi;'     => '&#928;',
+        '&Rho;'    => '&#929;',
+        '&Sigma;'  => '&#931;',
+        '&Tau;'    => '&#932;',
+        '&Upsilon;' => '&#933;',
+        '&Phi;'    => '&#934;',
+        '&Chi;'    => '&#935;',
+        '&Psi;'    => '&#936;',
+        '&Omega;'  => '&#937;',
+        '&alpha;'  => '&#945;',
+        '&beta;'   => '&#946;',
+        '&gamma;'  => '&#947;',
+        '&delta;'  => '&#948;',
+        '&epsilon;' => '&#949;',
+        '&zeta;'   => '&#950;',
+        '&eta;'    => '&#951;',
+        '&theta;'  => '&#952;',
+        '&iota;'   => '&#953;',
+        '&kappa;'  => '&#954;',
+        '&lambda;' => '&#955;',
+        '&mu;'     => '&#956;',
+        '&nu;'     => '&#957;',
+        '&xi;'     => '&#958;',
+        '&omicron;' => '&#959;',
+        '&pi;'     => '&#960;',
+        '&rho;'    => '&#961;',
+        '&sigmaf;' => '&#962;',
+        '&sigma;'  => '&#963;',
+        '&tau;'    => '&#964;',
+        '&upsilon;' => '&#965;',
+        '&phi;'    => '&#966;',
+        '&chi;'    => '&#967;',
+        '&psi;'    => '&#968;',
+        '&omega;'  => '&#969;',
+        '&thetasym;' => '&#977;',
+        '&upsih;'  => '&#978;',
+        '&piv;'    => '&#982;',
+        // General Punctuation
+        '&bull;'   => '&#8226;',
+        '&hellip;' => '&#8230;',
+        '&prime;'  => '&#8242;',
+        '&Prime;'  => '&#8243;',
+        '&oline;'  => '&#8254;',
+        '&frasl;'  => '&#8260;',
+        // Letterlike Symbols
+        '&weierp;' => '&#8472;',
+        '&image;'  => '&#8465;',
+        '&real;'   => '&#8476;',
+        '&trade;'  => '&#8482;',
+        '&alefsym;' => '&#8501;',
+        // Arrows
+        '&larr;'   => '&#8592;',
+        '&uarr;'   => '&#8593;',
+        '&rarr;'   => '&#8594;',
+        '&darr;'   => '&#8595;',
+        '&harr;'   => '&#8596;',
+        '&crarr;'  => '&#8629;',
+        '&lArr;'   => '&#8656;',
+        '&uArr;'   => '&#8657;',
+        '&rArr;'   => '&#8658;',
+        '&dArr;'   => '&#8659;',
+        '&hArr;'   => '&#8660;',
+        // Mathematical Operators
+        '&forall;' => '&#8704;',
+        '&part;'   => '&#8706;',
+        '&exist;'  => '&#8707;',
+        '&empty;'  => '&#8709;',
+        '&nabla;'  => '&#8711;',
+        '&isin;'   => '&#8712;',
+        '&notin;'  => '&#8713;',
+        '&ni;'     => '&#8715;',
+        '&prod;'   => '&#8719;',
+        '&sum;'    => '&#8721;',
+        '&minus;'  => '&#8722;',
+        '&lowast;' => '&#8727;',
+        '&radic;'  => '&#8730;',
+        '&prop;'   => '&#8733;',
+        '&infin;'  => '&#8734;',
+        '&ang;'    => '&#8736;',
+        '&and;'    => '&#8743;',
+        '&or;'     => '&#8744;',
+        '&cap;'    => '&#8745;',
+        '&cup;'    => '&#8746;',
+        '&int;'    => '&#8747;',
+        '&there4;' => '&#8756;',
+        '&sim;'    => '&#8764;',
+        '&cong;'   => '&#8773;',
+        '&asymp;'  => '&#8776;',
+        '&ne;'     => '&#8800;',
+        '&equiv;'  => '&#8801;',
+        '&le;'     => '&#8804;',
+        '&ge;'     => '&#8805;',
+        '&sub;'    => '&#8834;',
+        '&sup;'    => '&#8835;',
+        '&nsub;'   => '&#8836;',
+        '&sube;'   => '&#8838;',
+        '&supe;'   => '&#8839;',
+        '&oplus;'  => '&#8853;',
+        '&otimes;' => '&#8855;',
+        '&perp;'   => '&#8869;',
+        '&sdot;'   => '&#8901;',
+        // Miscellaneous Technical
+        '&lceil;'  => '&#8968;',
+        '&rceil;'  => '&#8969;',
+        '&lfloor;' => '&#8970;',
+        '&rfloor;' => '&#8971;',
+        '&lang;'   => '&#9001;',
+        '&rang;'   => '&#9002;',
+        // Geometric Shapes
+        '&loz;'    => '&#9674;',
+        // Miscellaneous Symbols
+        '&spades;' => '&#9824;',
+        '&clubs;'  => '&#9827;',
+        '&hearts;' => '&#9829;',
+        '&diams;'  => '&#9830;');
+
+    $str = str_replace(array_keys($entities), array_values($entities), $str);
+
+    return $str;
+}
 
 /* ------------------------------ main --------------------------- */