php - soporta - optimizacion de consultas sql
Convierta todos los tipos de presupuestos inteligentes con PHP (1)
Necesitas algo como esto (asumiendo la entrada UTF-8 e ignorando CJK (chino, japonés, coreano)):
$chr_map = array(
// Windows codepage 1252
"/xC2/x82" => "''", // U+0082⇒U+201A single low-9 quotation mark
"/xC2/x84" => ''"'', // U+0084⇒U+201E double low-9 quotation mark
"/xC2/x8B" => "''", // U+008B⇒U+2039 single left-pointing angle quotation mark
"/xC2/x91" => "''", // U+0091⇒U+2018 left single quotation mark
"/xC2/x92" => "''", // U+0092⇒U+2019 right single quotation mark
"/xC2/x93" => ''"'', // U+0093⇒U+201C left double quotation mark
"/xC2/x94" => ''"'', // U+0094⇒U+201D right double quotation mark
"/xC2/x9B" => "''", // U+009B⇒U+203A single right-pointing angle quotation mark
// Regular Unicode // U+0022 quotation mark (")
// U+0027 apostrophe ('')
"/xC2/xAB" => ''"'', // U+00AB left-pointing double angle quotation mark
"/xC2/xBB" => ''"'', // U+00BB right-pointing double angle quotation mark
"/xE2/x80/x98" => "''", // U+2018 left single quotation mark
"/xE2/x80/x99" => "''", // U+2019 right single quotation mark
"/xE2/x80/x9A" => "''", // U+201A single low-9 quotation mark
"/xE2/x80/x9B" => "''", // U+201B single high-reversed-9 quotation mark
"/xE2/x80/x9C" => ''"'', // U+201C left double quotation mark
"/xE2/x80/x9D" => ''"'', // U+201D right double quotation mark
"/xE2/x80/x9E" => ''"'', // U+201E double low-9 quotation mark
"/xE2/x80/x9F" => ''"'', // U+201F double high-reversed-9 quotation mark
"/xE2/x80/xB9" => "''", // U+2039 single left-pointing angle quotation mark
"/xE2/x80/xBA" => "''", // U+203A single right-pointing angle quotation mark
);
$chr = array_keys ($chr_map); // but: for efficiency you should
$rpl = array_values($chr_map); // pre-calculate these two arrays
$str = str_replace($chr, $rpl, html_entity_decode($str, ENT_QUOTES, "UTF-8"));
Aquí viene el fondo:
Cada carácter Unicode pertenece exactamente a una "Categoría general" , de las cuales las que pueden contener caracteres de comillas son las siguientes:
-
Ps
"Puntuación, abierto" -
Pe
"puntuación, cierre" -
Pi
"Puntuación, cita inicial (puede comportarse como Ps o Pe dependiendo del uso)" -
Pf
"Puntuación, cita final (puede comportarse como Ps o Pe según el uso)" -
Po
"Puntuación, Otro"
(Estas páginas son prácticas para verificar que no se haya perdido nada, también hay un índice de categorías )
A veces es útil hacer coincidir estas categorías en una expresión regular habilitada para Unicode.
Además, los caracteres Unicode tienen "propiedades" , de las cuales la que le interesa es Quotation_Mark
. Desafortunadamente, estos no son accesibles en una expresión regular.
En Wikipedia puede encontrar el grupo de caracteres con la propiedad Quotation_Mark
. La referencia final es PropList.txt en unicode.org, pero este es un archivo de texto ASCII.
En caso de que necesite traducir caracteres CJK también, solo tiene que obtener sus puntos de código, decidir su traducción y encontrar su codificación UTF-8, por ejemplo, buscándolo en fileformat.info (por ejemplo, para U + 301E: http : //www.fileformat.info/info/unicode/char/301e/index.htm ).
Con respecto a la página de códigos 1252 de Windows: Unicode define los primeros 256 puntos de código para representar exactamente los mismos caracteres que ISO-8859-1 , pero ISO-8859-1 a menudo se confunde con la página de códigos 1252 de Windows , de modo que todos los navegadores muestran el rango 0x80-0x9F, que está "vacío" en ISO-8859-1 (más exactamente: contiene caracteres de control), como si fuera la página de códigos de Windows 1252. La tabla en la página de Wikipedia enumera los equivalentes de Unicode.
Nota: strtr()
suele ser más lento que str_replace()
. Mida con su entrada y su versión de PHP. Si es lo suficientemente rápido, puede usar directamente un mapa como my $chr_map
.
Si no está seguro de que su entrada está codificada en UTF-8, Y está dispuesto a asumir que si no es así, entonces es ISO-8859-1 o la página de códigos de Windows 1252, entonces puede hacer esto antes que cualquier otra cosa:
if ( !preg_match(''/^//X*$/u'', $str)) {
$str = utf8_encode($str);
}
Advertencia: esta expresión regular puede, en casos muy raros, no detectar una codificación que no sea UTF-8. Por ejemplo: "Gruß…"/*CP-1252*/=="Gru/xDF/x85"
parece a UTF-8 a esta expresión regular (U + 07C5 es el dígito N''ko 5). Esta expresión regular se puede mejorar ligeramente, pero desafortunadamente se puede demostrar que NO existe una solución completamente infalible para el problema de la detección de codificación.
Si desea normalizar el rango 0x80-0x9F que se deriva de la página de códigos 1252 de Windows a los puntos de código Unicode normales, puede hacerlo (y eliminar la primera parte del $chr_map
anterior):
$normalization_map = array(
"/xC2/x80" => "/xE2/x82/xAC", // U+20AC Euro sign
"/xC2/x82" => "/xE2/x80/x9A", // U+201A single low-9 quotation mark
"/xC2/x83" => "/xC6/x92", // U+0192 latin small letter f with hook
"/xC2/x84" => "/xE2/x80/x9E", // U+201E double low-9 quotation mark
"/xC2/x85" => "/xE2/x80/xA6", // U+2026 horizontal ellipsis
"/xC2/x86" => "/xE2/x80/xA0", // U+2020 dagger
"/xC2/x87" => "/xE2/x80/xA1", // U+2021 double dagger
"/xC2/x88" => "/xCB/x86", // U+02C6 modifier letter circumflex accent
"/xC2/x89" => "/xE2/x80/xB0", // U+2030 per mille sign
"/xC2/x8A" => "/xC5/xA0", // U+0160 latin capital letter s with caron
"/xC2/x8B" => "/xE2/x80/xB9", // U+2039 single left-pointing angle quotation mark
"/xC2/x8C" => "/xC5/x92", // U+0152 latin capital ligature oe
"/xC2/x8E" => "/xC5/xBD", // U+017D latin capital letter z with caron
"/xC2/x91" => "/xE2/x80/x98", // U+2018 left single quotation mark
"/xC2/x92" => "/xE2/x80/x99", // U+2019 right single quotation mark
"/xC2/x93" => "/xE2/x80/x9C", // U+201C left double quotation mark
"/xC2/x94" => "/xE2/x80/x9D", // U+201D right double quotation mark
"/xC2/x95" => "/xE2/x80/xA2", // U+2022 bullet
"/xC2/x96" => "/xE2/x80/x93", // U+2013 en dash
"/xC2/x97" => "/xE2/x80/x94", // U+2014 em dash
"/xC2/x98" => "/xCB/x9C", // U+02DC small tilde
"/xC2/x99" => "/xE2/x84/xA2", // U+2122 trade mark sign
"/xC2/x9A" => "/xC5/xA1", // U+0161 latin small letter s with caron
"/xC2/x9B" => "/xE2/x80/xBA", // U+203A single right-pointing angle quotation mark
"/xC2/x9C" => "/xC5/x93", // U+0153 latin small ligature oe
"/xC2/x9E" => "/xC5/xBE", // U+017E latin small letter z with caron
"/xC2/x9F" => "/xC5/xB8", // U+0178 latin capital letter y with diaeresis
);
$chr = array_keys ($normalization_map); // but: for efficiency you should
$rpl = array_values($normalization_map); // pre-calculate these two arrays
$str = str_replace($chr, $rpl, $str);
Estoy tratando de convertir todos los tipos de presupuestos inteligentes a comillas regulares cuando trabajo con texto. Sin embargo, la siguiente función que he compilado todavía parece carecer de soporte y diseño adecuado.
¿Alguien sabe cómo convertir correctamente todos los caracteres de comillas ?
function convert_smart_quotes($string)
{
$quotes = array(
"/xC2/xAB" => ''"'', // « (U+00AB) in UTF-8
"/xC2/xBB" => ''"'', // » (U+00BB) in UTF-8
"/xE2/x80/x98" => "''", // ‘ (U+2018) in UTF-8
"/xE2/x80/x99" => "''", // ’ (U+2019) in UTF-8
"/xE2/x80/x9A" => "''", // ‚ (U+201A) in UTF-8
"/xE2/x80/x9B" => "''", // ‛ (U+201B) in UTF-8
"/xE2/x80/x9C" => ''"'', // “ (U+201C) in UTF-8
"/xE2/x80/x9D" => ''"'', // ” (U+201D) in UTF-8
"/xE2/x80/x9E" => ''"'', // „ (U+201E) in UTF-8
"/xE2/x80/x9F" => ''"'', // ‟ (U+201F) in UTF-8
"/xE2/x80/xB9" => "''", // ‹ (U+2039) in UTF-8
"/xE2/x80/xBA" => "''", // › (U+203A) in UTF-8
);
$string = strtr($string, $quotes);
// Version 2
$search = array(
chr(145),
chr(146),
chr(147),
chr(148),
chr(151)
);
$replace = array("''","''",''"'',''"'','' - '');
$string = str_replace($search, $replace, $string);
// Version 3
$string = str_replace(
array(''‘'',''’'',''“'',''”''),
array("''", "''", ''"'', ''"''),
$string
);
// Version 4
$search = array(
''‘'',
''’'',
''“'',
''”'',
''—'',
''–'',
);
$replace = array("''","''",''"'',''"'','' - '', ''-'');
$string = str_replace($search, $replace, $string);
return $string;
}
Nota: Esta pregunta es una consulta completa sobre la gama completa de citas que incluye las cotizaciones de "Microsoft" que se preguntan aquí. Esto es un "duplicado" del mismo modo que preguntar sobre todos los tamaños de neumáticos es un "duplicado" de pedir un neumático de automóvil. tamaño.