PHP에서 Microsoft로 인코딩된 따옴표를 대체하는 방법
Microsoft Word 버전의 싱글 따옴표와 더블 따옴표를 교환해야 합니다.“ ” ‘ ’
어플리케이션의 부호화 문제로 인해 따옴표(' 및 ')가 표시됩니다.HTML 엔티티일 필요는 없으며 데이터베이스 스키마를 변경할 수 없습니다.
두 가지 옵션이 있습니다. 정규 표현식 또는 연관된 배열 중 하나를 사용합니다.
더 좋은 방법이 있을까요?
나는 이 질문에 대한 답을 찾았다.코드 한 줄만 사용하면 됩니다.iconv()
php의 함수:
// replace Microsoft Word version of single and double quotations marks (“ ” ‘ ’) with regular quotes (' and ")
$output = iconv('UTF-8', 'ASCII//TRANSLIT', $input);
당신이 특정하고 잘 식별된 몇 개의 캐릭터만 대체하고 싶어한다면, 나는 배열로 할 것이다: 당신은 분명히 무거운 포병 정규식이 당신에게 가져다 줄 필요가 없다;-)
또, 그 외의 특수 문자(Microsoft Word 로부터 복사 붙여넣기)가 발생했을 경우는, 필요에 따라서, 특정할 때마다 그 문자를 그 어레이에 추가할 수 있습니다.
당신의 코멘트에 대해 제가 드릴 수 있는 최선의 답변은 아마도 이 링크일 것입니다: 스마트 인용문을 PHP로 변환합니다.
관련 코드(페이지 인용):
function convert_smart_quotes($string)
{
$search = array(chr(145),
chr(146),
chr(147),
chr(148),
chr(151));
$replace = array("'",
"'",
'"',
'"',
'-');
return str_replace($search, $replace, $string);
}
(이 컴퓨터에 Microsoft Word가 없기 때문에 직접 테스트할 수 없습니다.)
우리가 직장에서 무엇을 사용했는지 정확히 기억은 나지 않지만(그런 종류의 입력에 대처할 필요가 있는 것은 내가 아니었다) 그것은 같은 종류의 것이었다.
마이크로소프트에서 인코딩한 인용문은 아마도 타이포그래픽 따옴표일 것입니다.단순히 다음과 같이 대체할 수 있습니다.str_replace
에서 스트링을 치환하는 부호화를 알고 있는 경우.
UTF-8의 예를 다음에 나타냅니다.단일 매핑 어레이를 사용하는 경우는 다음과 같습니다.
$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
);
$str = strtr($str, $quotes);
다른 인코딩이 필요한 경우 를 사용하여 키를 변환할 수 있습니다.
저처럼 방대한 범위의 ASCII/Microsoft Word 문자를 사용하여 CMS나 RTE에 이상한 짓을 하고 아이콘v가 작동하지 않는 경우 이 미친 기능은 당신에게만 해당될 수 있습니다.
이 함수를 파일에 보존할 때는, 부호화가 UTF-8 인 것을 확인해 주세요.
<?php
/**
* fixMSWord
*
* Replace ASCII chars with UTF-8. Note there are ASCII characters that don't
* correctly map and will be replaced by spaces.
*
* @author Robin Cafolla
* @date 2013-03-22
*/
function fixMSWord($string) {
$map = Array(
'33' => '!', '34' => '"', '35' => '#', '36' => '$', '37' => '%', '38' => '&', '39' => "'", '40' => '(', '41' => ')', '42' => '*',
'43' => '+', '44' => ',', '45' => '-', '46' => '.', '47' => '/', '48' => '0', '49' => '1', '50' => '2', '51' => '3', '52' => '4',
'53' => '5', '54' => '6', '55' => '7', '56' => '8', '57' => '9', '58' => ':', '59' => ';', '60' => '<', '61' => '=', '62' => '>',
'63' => '?', '64' => '@', '65' => 'A', '66' => 'B', '67' => 'C', '68' => 'D', '69' => 'E', '70' => 'F', '71' => 'G', '72' => 'H',
'73' => 'I', '74' => 'J', '75' => 'K', '76' => 'L', '77' => 'M', '78' => 'N', '79' => 'O', '80' => 'P', '81' => 'Q', '82' => 'R',
'83' => 'S', '84' => 'T', '85' => 'U', '86' => 'V', '87' => 'W', '88' => 'X', '89' => 'Y', '90' => 'Z', '91' => '[', '92' => '\\',
'93' => ']', '94' => '^', '95' => '_', '96' => '`', '97' => 'a', '98' => 'b', '99' => 'c', '100'=> 'd', '101'=> 'e', '102'=> 'f',
'103'=> 'g', '104'=> 'h', '105'=> 'i', '106'=> 'j', '107'=> 'k', '108'=> 'l', '109'=> 'm', '110'=> 'n', '111'=> 'o', '112'=> 'p',
'113'=> 'q', '114'=> 'r', '115'=> 's', '116'=> 't', '117'=> 'u', '118'=> 'v', '119'=> 'w', '120'=> 'x', '121'=> 'y', '122'=> 'z',
'123'=> '{', '124'=> '|', '125'=> '}', '126'=> '~', '127'=> ' ', '128'=> '€', '129'=> ' ', '130'=> ',', '131'=> ' ', '132'=> '"',
'133'=> '.', '134'=> ' ', '135'=> ' ', '136'=> '^', '137'=> ' ', '138'=> ' ', '139'=> '<', '140'=> ' ', '141'=> ' ', '142'=> ' ',
'143'=> ' ', '144'=> ' ', '145'=> "'", '146'=> "'", '147'=> '"', '148'=> '"', '149'=> '.', '150'=> '-', '151'=> '-', '152'=> '~',
'153'=> ' ', '154'=> ' ', '155'=> '>', '156'=> ' ', '157'=> ' ', '158'=> ' ', '159'=> ' ', '160'=> ' ', '161'=> '¡', '162'=> '¢',
'163'=> '£', '164'=> '¤', '165'=> '¥', '166'=> '¦', '167'=> '§', '168'=> '¨', '169'=> '©', '170'=> 'ª', '171'=> '«', '172'=> '¬',
'173'=> '', '174'=> '®', '175'=> '¯', '176'=> '°', '177'=> '±', '178'=> '²', '179'=> '³', '180'=> '´', '181'=> 'µ', '182'=> '¶',
'183'=> '·', '184'=> '¸', '185'=> '¹', '186'=> 'º', '187'=> '»', '188'=> '¼', '189'=> '½', '190'=> '¾', '191'=> '¿', '192'=> 'À',
'193'=> 'Á', '194'=> 'Â', '195'=> 'Ã', '196'=> 'Ä', '197'=> 'Å', '198'=> 'Æ', '199'=> 'Ç', '200'=> 'È', '201'=> 'É', '202'=> 'Ê',
'203'=> 'Ë', '204'=> 'Ì', '205'=> 'Í', '206'=> 'Î', '207'=> 'Ï', '208'=> 'Ð', '209'=> 'Ñ', '210'=> 'Ò', '211'=> 'Ó', '212'=> 'Ô',
'213'=> 'Õ', '214'=> 'Ö', '215'=> '×', '216'=> 'Ø', '217'=> 'Ù', '218'=> 'Ú', '219'=> 'Û', '220'=> 'Ü', '221'=> 'Ý', '222'=> 'Þ',
'223'=> 'ß', '224'=> 'à', '225'=> 'á', '226'=> 'â', '227'=> 'ã', '228'=> 'ä', '229'=> 'å', '230'=> 'æ', '231'=> 'ç', '232'=> 'è',
'233'=> 'é', '234'=> 'ê', '235'=> 'ë', '236'=> 'ì', '237'=> 'í', '238'=> 'î', '239'=> 'ï', '240'=> 'ð', '241'=> 'ñ', '242'=> 'ò',
'243'=> 'ó', '244'=> 'ô', '245'=> 'õ', '246'=> 'ö', '247'=> '÷', '248'=> 'ø', '249'=> 'ù', '250'=> 'ú', '251'=> 'û', '252'=> 'ü',
'253'=> 'ý', '254'=> 'þ', '255'=> 'ÿ'
);
$search = Array();
$replace = Array();
foreach ($map as $s => $r) {
$search[] = chr((int)$s);
$replace[] = $r;
}
return str_replace($search, $replace, $string);
}
Gumbo를 제외한 모든 이전 답변은 Unicode 문자열을 뒤죽박죽으로 만들 것입니다.
echo convert_smart_quotes("This is Yi: ꑑ. Point ⒒ this breaks Yi. Yi broke–why? I need a longer––point. This makes Han 嗗 mad.");
결과:
This is Yi: ?''. Point ?'' this breaks Yi. Yi broke?"why? I need a longer?"?"point. This makes Han ?-- mad.
아이콘v:
$output = iconv('UTF-8', 'ASCII//TRANSLIT', $input);
결과:
PHP 알림: iconv(): 1행의 php 셸 코드의 입력 문자열에서 잘못된 문자가 검출되었습니다.
수 요.//IGNORE
이 경우 문자가 삭제되지만 변환되지는 않습니다.
이것은 CP1252로 인코딩된 Microsoft 견적을 대체하는 가장 좋은 방법입니다.Unicode로 되어 있어 교환이 필요한 경우는, Gumbo 의 회답을 사용합니다.
function convert_cp1252_to_ascii($input, $default = '') {
if ($input === null || $input == '') {
return $default;
}
// https://en.wikipedia.org/wiki/UTF-8
// https://en.wikipedia.org/wiki/ISO/IEC_8859-1
// https://en.wikipedia.org/wiki/Windows-1252
// http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT
$encoding = mb_detect_encoding($input, array('Windows-1252', 'ISO-8859-1'), true);
if ($encoding == 'ISO-8859-1' || $encoding == 'Windows-1252') {
/*
* Use the search/replace arrays if a character needs to be replaced with
* something other than its Unicode equivalent.
*/
$replace = array(
128 => "E", // http://www.fileformat.info/info/unicode/char/20AC/index.htm EURO SIGN
129 => "", // UNDEFINED
130 => ",", // http://www.fileformat.info/info/unicode/char/201A/index.htm SINGLE LOW-9 QUOTATION MARK
131 => "f", // http://www.fileformat.info/info/unicode/char/0192/index.htm LATIN SMALL LETTER F WITH HOOK
132 => ",,", // http://www.fileformat.info/info/unicode/char/201e/index.htm DOUBLE LOW-9 QUOTATION MARK
133 => "...", // http://www.fileformat.info/info/unicode/char/2026/index.htm HORIZONTAL ELLIPSIS
134 => "t", // http://www.fileformat.info/info/unicode/char/2020/index.htm DAGGER
135 => "T", // http://www.fileformat.info/info/unicode/char/2021/index.htm DOUBLE DAGGER
136 => "^", // http://www.fileformat.info/info/unicode/char/02c6/index.htm MODIFIER LETTER CIRCUMFLEX ACCENT
137 => "%", // http://www.fileformat.info/info/unicode/char/2030/index.htm PER MILLE SIGN
138 => "S", // http://www.fileformat.info/info/unicode/char/0160/index.htm LATIN CAPITAL LETTER S WITH CARON
139 => "<", // http://www.fileformat.info/info/unicode/char/2039/index.htm SINGLE LEFT-POINTING ANGLE QUOTATION MARK
140 => "OE", // http://www.fileformat.info/info/unicode/char/0152/index.htm LATIN CAPITAL LIGATURE OE
141 => "", // UNDEFINED
142 => "Z", // http://www.fileformat.info/info/unicode/char/017d/index.htm LATIN CAPITAL LETTER Z WITH CARON
143 => "", // UNDEFINED
144 => "", // UNDEFINED
145 => "'", // http://www.fileformat.info/info/unicode/char/2018/index.htm LEFT SINGLE QUOTATION MARK
146 => "'", // http://www.fileformat.info/info/unicode/char/2019/index.htm RIGHT SINGLE QUOTATION MARK
147 => "\"", // http://www.fileformat.info/info/unicode/char/201c/index.htm LEFT DOUBLE QUOTATION MARK
148 => "\"", // http://www.fileformat.info/info/unicode/char/201d/index.htm RIGHT DOUBLE QUOTATION MARK
149 => "*", // http://www.fileformat.info/info/unicode/char/2022/index.htm BULLET
150 => "-", // http://www.fileformat.info/info/unicode/char/2013/index.htm EN DASH
151 => "--", // http://www.fileformat.info/info/unicode/char/2014/index.htm EM DASH
152 => "~", // http://www.fileformat.info/info/unicode/char/02DC/index.htm SMALL TILDE
153 => "TM", // http://www.fileformat.info/info/unicode/char/2122/index.htm TRADE MARK SIGN
154 => "s", // http://www.fileformat.info/info/unicode/char/0161/index.htm LATIN SMALL LETTER S WITH CARON
155 => ">", // http://www.fileformat.info/info/unicode/char/203A/index.htm SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
156 => "oe", // http://www.fileformat.info/info/unicode/char/0153/index.htm LATIN SMALL LIGATURE OE
157 => "", // UNDEFINED
158 => "z", // http://www.fileformat.info/info/unicode/char/017E/index.htm LATIN SMALL LETTER Z WITH CARON
159 => "Y", // http://www.fileformat.info/info/unicode/char/0178/index.htm LATIN CAPITAL LETTER Y WITH DIAERESIS
);
$find = array();
foreach (array_keys($replace) as $key) {
$find[] = chr($key);
}
$input = str_replace($find, array_values($replace), $input);
/*
* Because ISO-8859-1 and CP1252 are identical except for 0x80 through 0x9F
* and control characters, always convert from Windows-1252 to UTF-8.
*/
$input = iconv('Windows-1252', 'UTF-8//IGNORE', $input);
}
return $input;
}
이 답변에서 몇 가지 수정을 가합니다.검색/바꾸기를 제어하려면 이 기능을 사용하십시오.
우리는 다음을 사용했다.그것은 몇 가지 더 특별한 캐릭터들을 다루고 있다.
$text = str_replace(chr(130), ',', $text); // Baseline single quote
$text = str_replace(chr(132), '"', $text); // Baseline double quote
$text = str_replace(chr(133), '...', $text); // Ellipsis
$text = str_replace(chr(145), "'", $text); // Left single quote
$text = str_replace(chr(146), "'", $text); // Right single quote
$text = str_replace(chr(147), '"', $text); // Left double quote
$text = str_replace(chr(148), '"', $text); // Right double quote
$text = mb_convert_encoding($text, 'HTML-ENTITIES', 'UTF-8');
언급URL : https://stackoverflow.com/questions/1262038/how-to-replace-microsoft-encoded-quotes-in-php
'programing' 카테고리의 다른 글
Google Compute Engine VM에서 MySQL에 원격 연결 (0) | 2022.10.11 |
---|---|
MySQL 사용자 이름과 비밀번호를 가져오려면 어떻게 해야 합니까? (0) | 2022.10.11 |
Twig에서 배열 설정 요소 (0) | 2022.10.11 |
MariaDB 홈브루 설치 오류 (0) | 2022.10.11 |
Kotlin의 Java static final 필드에 해당하는 것은 무엇입니까? (0) | 2022.10.11 |