2015-12-15 11 views
5

ideographischer Raum ist http://www.charbase.com/3000-unicode-ideographic-space, es ist eine CJK-Interpunktion. Es sieht aus wie ein normaler Platz, aber es nimmt tatsächlich 2 Positionen im Bildschirm statt 1 (wie ein chinesisches Zeichen würde)Wie ideografischen Raum in PHP-String ersetzen?

Ich versuchte mit str_replace(" ","",$mystring), um sie loszuwerden, aber natürlich funktioniert es nicht, weil die Raum, den ich hier eingib, ist ein ASCII-Raum. Ich habe auch versucht, den ideografischen Raum manuell einzugeben, indem ich die chinesische Zeicheneingabemethode benutze, aber es sieht so aus, als würde ich auch einen Teil des Codes anderer Charaktere loswerden und es gibt Kauderwelsch zurück.

Also, wie kann ich diese Räume loswerden?

+0

Wie wäre es mit 'trim()'? –

+0

@ AlvaroFlañoLarrondo .. Entschuldigung, nein. Probieren Sie: 'php -r 'trimmen (html_entity_decode (" & # x3000; a ")). "\ n"; "" .. Und die [Dokumentation für 'trim()'] (http://php.net/trim) listet eindeutig die Zeichen auf, von denen angenommen wird, dass sie Leerzeichen sind, und 0x3000 gehört nicht dazu. – ghoti

Antwort

2

Ich konnte das Zeichen ganz gut ersetzen, indem ich das Symbol von der Informationsseite kopiere, mit der Sie verbunden sind. Sie möchten möglicherweise einen CONST Alias ​​für den ideografischen Raum erstellen, um Code einfacher zu machen und zu finden/zu ersetzen.

// contains ideographic space between words 
$start = 'before after';      

// contains ideographic space in needle parameter 
$test1 = str_replace(' ', '_', $start);  

// contains ideographic space 
define('ID_SPACE', ' ');      
$test2 = str_replace(ID_SPACE, '&', $start); 

// contains normal space in needle parameter 
$test3 = str_replace(' ','_',$start);  

// make sure we are using utf8 for this test 
header('Content-Type: text/html; charset=utf-8'); 

echo $start.'<br/>'; 
echo $test1.'<br/>'; 
echo $test2.'<br/>'; 
echo $test3; 

Ausgang:

before after 
before_after 
before&after 
before after 

bearbeiten als Antwort

in Frage zu stellen, während Sie es nicht sehen können, wird das Zeichen in der Box gezeigt angezeigt wird, klicken Sie einfach ziehen, wie zu wählen Sie würden jeden anderen Text, und dann können Sie es bei Bedarf einfügen. Sie können den Code auch von meiner Antwort kopieren, die den Raum enthält. Wenn Sie so etwas wie   sehen, dann müssen Sie Ihre charset auf utf-8 setzen

enter image description here

+0

eh ... bitte erleuchten Sie mich darüber, wie Sie das Symbol von der Seite kopieren .. – shenkwen

+0

siehe Bild hinzugefügt – WebChemist

0

Sie können direkt die Dinge aus ihren entkam numerischen Werten konvertieren. Ich habe seit Jahren die folgende Funktion gehabt. Ich habe es nicht geschrieben, und ich fürchte, ich weiß nicht, wo ich es gefunden habe. Es ist ein bisschen ein Hack, aber ein verdammt nützlicher, denke ich.

<?php 

function code2utf($num) { 
    if($num<128)return chr($num); 
    if($num<2048)return chr(($num>>6)+192).chr(($num&63)+128); 
    if($num<65536)return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128); 
    if($num<2097152)return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128).chr(($num&63)+128); 
    return ''; 
} 

print "a" . code2utf(0x3000) . "b" . code2utf(0x1f44d) . "\n"; 

Und wenn ich diese laufen, ich sehe:

$ php -f utftest 
a b 

Beachten Sie, dass das, was wie zwei Räume sieht ein einziger doppelt breite Charakter.

Vielleicht können Sie die obige Funktion benutzen, um Ihre Eingabe String zu erstellen, wie folgt aus:

str_replace(code2utf(0x3000),"",$mystring); 

Der offensichtliche Vorteil einer Lösung wie dieser über WebChemist die copy-and-paste-Lösung ist, dass es ganz programmatisch ist, und erfordert keine speziellen Funktionen als Teil der Programmierwerkzeuge. Sie werden nicht versehentlich das ID_SPACE-Zeichen überschreiben, wenn Sie Ihren Code neu formatieren, und die Funktion ist für andere UTF8-Zeichen, die Sie möglicherweise darstellen müssen, wiederverwendbar, ohne dass diese Zeichen in Ihrem Code enthalten sein müssen.


Natürlich ist die andere Art und Weise Sie dies tun könnte ist die integrierte PHP-Funktion html_entity_decode().Im Folgenden werden Ergebnisse identisch mit meiner Funktion, mit HTML-Zeichen als Eingabe entkam:

$ php -r 'print html_entity_decode("a&#x3000;b&#x1f44d;") . "\n";' 
a b 
0

Ein Verfahren, das auch für mich gearbeitet, roh Codierung es in HTML-Entities & str_replace wieder zu einem normalen Leerzeichen.

//The space we're looking out for 
$ideoSpace  = "%26%23x3000%3B"; 
$space   = "%20"; 

//Search string (Notice the wider space) 
$searchstr = "Please find me a Oil Filter"; 

//Begin conversion 
$searchstr = rawurldecode(str_replace($ideoSpace, $space, rawurlencode($searchstr))); 

//echos "Please find me a Oil Filter" 

Vielleicht nicht die eleganteste Lösung. Leider funktionierte die Suche nicht für uns, da implode() die Strings für unsere japanischen Kunden nicht teilen konnte.