<?php
/**
* Tools to help with ASCII in UTF-8
* @version $Id: ascii.php 10381 2008-06-01 03:35:53Z pasamio $
* @package utf8
* @subpackage ascii
*/
//---------------------------------------------------------------
/**
* UTF-8 lookup table for lower case accented letters
* This lookuptable defines replacements for accented characters from the ASCII-7
* range. This are lower case letters only.
* @author Andreas Gohr <hide@address.com>
* @see utf8_deaccent()
* @package utf8
* @subpackage ascii
*/
$GLOBALS['UTF8_LOWER_ACCENTS'] = array(
'à ' => 'a', 'ô' => 'o', 'ÃÂ?' => 'd', 'ḟ' => 'f', 'ë' => 'e', 'Ã
¡' => 's', 'á' => 'o',
'ß' => 'ss', 'ÃÆ' => 'a', 'Ã
â¢' => 'r', 'Ãâº' => 't', 'Ã
Ë' => 'n', 'ÃÂ?' => 'a', '÷' => 'k',
'Ã
Â?' => 's', 'ỳ' => 'y', 'Ã
â ' => 'n', 'ú' => 'l', 'ç' => 'h', 'á¹â' => 'p', 'ó' => 'o',
'ú' => 'u', 'Ãâº' => 'e', 'é' => 'e', 'ç' => 'c', 'áºÂ?' => 'w', 'Ãâ¹' => 'c', 'õ' => 'o',
'ṡ' => 's', 'ø' => 'o', 'ã' => 'g', 'Ã
§' => 't', 'Ãâ¢' => 's', 'Ãâ' => 'e', 'Ãâ°' => 'c',
'Ã
âº' => 's', 'î' => 'i', 'Ã
±' => 'u', 'Ãâ¡' => 'c', 'Ãâ¢' => 'e', 'Ã
µ' => 'w', 'ṫ' => 't',
'Ã
«' => 'u', 'ÃÂ?' => 'c', 'ö' => 'oe', 'è' => 'e', 'Ã
·' => 'y', 'Ãâ¦' => 'a', 'Ã
â' => 'l',
'Ã
³' => 'u', 'Ã
¯' => 'u', 'Ã
Ÿ' => 's', 'ß' => 'g', 'ü' => 'l', 'Ãâ' => 'f', 'Ã
¾' => 'z',
'áºÆ' => 'w', 'á¸Æ' => 'b', 'ÃÂ¥' => 'a', 'ì' => 'i', 'ï' => 'i', 'á¸â¹' => 'd', 'Ã
Â¥' => 't',
'Ã
â' => 'r', 'ä' => 'ae', 'ÃÂ' => 'i', 'Ã
â¢' => 'r', 'ê' => 'e', 'ü' => 'ue', 'ò' => 'o',
'Ãâ' => 'e', 'ñ' => 'n', 'Ã
â' => 'n', 'ÃÂ¥' => 'h', 'ÃÂ?' => 'g', 'Ãâ' => 'd', 'õ' => 'j',
'ÿ' => 'y', 'Ã
©' => 'u', 'Ã
Â' => 'u', 'ð' => 'u', 'Ã
£' => 't', 'ý' => 'y', 'Ã
â' => 'o',
'â' => 'a', 'þ' => 'l', 'áºâ¦' => 'w', 'Ã
¼' => 'z', 'ë' => 'i', 'ã' => 'a', 'á' => 'g',
'á¹Â?' => 'm', 'Ã
Â?' => 'o', 'é' => 'i', 'ù' => 'u', 'ï' => 'i', 'Ã
º' => 'z', 'á' => 'a',
'û' => 'u', 'þ' => 'th', 'ð' => 'dh', 'æ' => 'ae', 'õ' => 'u',
);
//---------------------------------------------------------------
/**
* UTF-8 lookup table for upper case accented letters
* This lookuptable defines replacements for accented characters from the ASCII-7
* range. This are upper case letters only.
* @author Andreas Gohr <hide@address.com>
* @see utf8_deaccent()
* @package utf8
* @subpackage ascii
*/
$GLOBALS['UTF8_UPPER_ACCENTS'] = array(
'à ' => 'A', 'ô' => 'O', 'ÃÂ?' => 'D', 'ḟ' => 'F', 'ë' => 'E', 'Ã
¡' => 'S', 'á' => 'O',
'ß' => 'Ss', 'ÃÆ' => 'A', 'Ã
â¢' => 'R', 'Ãâº' => 'T', 'Ã
Ë' => 'N', 'ÃÂ?' => 'A', '÷' => 'K',
'Ã
Â?' => 'S', 'ỳ' => 'Y', 'Ã
â ' => 'N', 'ú' => 'L', 'ç' => 'H', 'á¹â' => 'P', 'ó' => 'O',
'ú' => 'U', 'Ãâº' => 'E', 'é' => 'E', 'ç' => 'C', 'áºÂ?' => 'W', 'Ãâ¹' => 'C', 'õ' => 'O',
'ṡ' => 'S', 'ø' => 'O', 'ã' => 'G', 'Ã
§' => 'T', 'Ãâ¢' => 'S', 'Ãâ' => 'E', 'Ãâ°' => 'C',
'Ã
âº' => 'S', 'î' => 'I', 'Ã
±' => 'U', 'Ãâ¡' => 'C', 'Ãâ¢' => 'E', 'Ã
µ' => 'W', 'ṫ' => 'T',
'Ã
«' => 'U', 'ÃÂ?' => 'C', 'ö' => 'Oe', 'è' => 'E', 'Ã
·' => 'Y', 'Ãâ¦' => 'A', 'Ã
â' => 'L',
'Ã
³' => 'U', 'Ã
¯' => 'U', 'Ã
Ÿ' => 'S', 'ß' => 'G', 'ü' => 'L', 'Ãâ' => 'F', 'Ã
¾' => 'Z',
'áºÆ' => 'W', 'á¸Æ' => 'B', 'ÃÂ¥' => 'A', 'ì' => 'I', 'ï' => 'I', 'á¸â¹' => 'D', 'Ã
Â¥' => 'T',
'Ã
â' => 'R', 'ä' => 'Ae', 'ÃÂ' => 'I', 'Ã
â¢' => 'R', 'ê' => 'E', 'ü' => 'Ue', 'ò' => 'O',
'Ãâ' => 'E', 'ñ' => 'N', 'Ã
â' => 'N', 'ÃÂ¥' => 'H', 'ÃÂ?' => 'G', 'Ãâ' => 'D', 'õ' => 'J',
'ÿ' => 'Y', 'Ã
©' => 'U', 'Ã
Â' => 'U', 'ð' => 'U', 'Ã
£' => 'T', 'ý' => 'Y', 'Ã
â' => 'O',
'â' => 'A', 'þ' => 'L', 'áºâ¦' => 'W', 'Ã
¼' => 'Z', 'ë' => 'I', 'ã' => 'A', 'á' => 'G',
'á¹Â?' => 'M', 'Ã
Â?' => 'O', 'é' => 'I', 'ù' => 'U', 'ï' => 'I', 'Ã
º' => 'Z', 'á' => 'A',
'û' => 'U', 'Þ' => 'Th', 'ÃÂ?' => 'Dh', 'Ãâ ' => 'Ae',
);
//--------------------------------------------------------------------
/**
* Tests whether a string contains only 7bit ASCII bytes.
* You might use this to conditionally check whether a string
* needs handling as UTF-8 or not, potentially offering performance
* benefits by using the native PHP equivalent if it's just ASCII e.g.;
*
* <code>
* <?php
* if ( utf8_is_ascii($someString) ) {
* // It's just ASCII - use the native PHP version
* $someString = strtolower($someString);
* } else {
* $someString = utf8_strtolower($someString);
* }
* ?>
* </code>
*
* @param string
* @return boolean TRUE if it's all ASCII
* @package utf8
* @subpackage ascii
* @see utf8_is_ascii_ctrl
*/
function utf8_is_ascii($str) {
if ( strlen($str) > 0 ) {
// Search for any bytes which are outside the ASCII range...
return (preg_match('/[^\x00-\x7F]/',$str) !== 1);
}
return FALSE;
}
//--------------------------------------------------------------------
/**
* Tests whether a string contains only 7bit ASCII bytes with device
* control codes omitted. The device control codes can be found on the
* second table here: http://www.w3schools.com/tags/ref_ascii.asp
*
* @param string
* @return boolean TRUE if it's all ASCII without device control codes
* @package utf8
* @subpackage ascii
* @see utf8_is_ascii
*/
function utf8_is_ascii_ctrl($str) {
if ( strlen($str) > 0 ) {
// Search for any bytes which are outside the ASCII range,
// or are device control codes
return (preg_match('/[^\x09\x0A\x0D\x20-\x7E]/',$str) !== 1);
}
return FALSE;
}
//--------------------------------------------------------------------
/**
* Strip out all non-7bit ASCII bytes
* If you need to transmit a string to system which you know can only
* support 7bit ASCII, you could use this function.
* @param string
* @return string with non ASCII bytes removed
* @package utf8
* @subpackage ascii
* @see utf8_strip_non_ascii_ctrl
*/
function utf8_strip_non_ascii($str) {
ob_start();
while ( preg_match(
'/^([\x00-\x7F]+)|([^\x00-\x7F]+)/S',
$str, $matches) ) {
if ( !isset($matches[2]) ) {
echo $matches[0];
}
$str = substr($str, strlen($matches[0]));
}
$result = ob_get_contents();
ob_end_clean();
return $result;
}
//--------------------------------------------------------------------
/**
* Strip out all non 7bit ASCII bytes and ASCII device control codes.
* For a list of ASCII device control codes see the 2nd table here:
* http://www.w3schools.com/tags/ref_ascii.asp
*
* @param string
* @return boolean TRUE if it's all ASCII
* @package utf8
* @subpackage ascii
*/
function utf8_strip_non_ascii_ctrl($str) {
ob_start();
while ( preg_match(
'/^([\x09\x0A\x0D\x20-\x7E]+)|([^\x09\x0A\x0D\x20-\x7E]+)/S',
$str, $matches) ) {
if ( !isset($matches[2]) ) {
echo $matches[0];
}
$str = substr($str, strlen($matches[0]));
}
$result = ob_get_contents();
ob_end_clean();
return $result;
}
//---------------------------------------------------------------
/**
* Replace accented UTF-8 characters by unaccented ASCII-7 "equivalents".
* The purpose of this function is to replace characters commonly found in Latin
* alphabets with something more or less equivalent from the ASCII range. This can
* be useful for converting a UTF-8 to something ready for a filename, for example.
* Following the use of this function, you would probably also pass the string
* through utf8_strip_non_ascii to clean out any other non-ASCII chars
* Use the optional parameter to just deaccent lower ($case = -1) or upper ($case = 1)
* letters. Default is to deaccent both cases ($case = 0)
* @param string UTF-8 string
* @param int (optional) -1 lowercase only, +1 uppercase only, 1 both cases
* @param string UTF-8 with accented characters replaced by ASCII chars
* @return string accented chars replaced with ascii equivalents
* @author Andreas Gohr <hide@address.com>
* @package utf8
* @subpackage ascii
*/
function utf8_accents_to_ascii( $str, $case=0 ){
if($case <= 0){
global $UTF8_LOWER_ACCENTS;
$string = str_replace(
array_keys($UTF8_LOWER_ACCENTS),
array_values($UTF8_LOWER_ACCENTS),
$str
);
}
if($case >= 0){
global $UTF8_UPPER_ACCENTS;
$string = str_replace(
array_keys($UTF8_UPPER_ACCENTS),
array_values($UTF8_UPPER_ACCENTS),
$str
);
}
return $str;
}