Esta pergunta parece embaraçosamente simples, mas não consegui encontrar uma resposta.
Qual é o PHP equivalente à seguinte linha de código C #?
string str = "\u1000";
Este exemplo cria uma sequência com um único caractere Unicode cujo "valor numérico Unicode" é 1000 em hexadecimal (4096 em decimal).
Ou seja, no PHP, como posso criar uma string com um único caractere Unicode cujo "valor numérico Unicode" é conhecido?
Respostas:
Como o JSON suporta diretamente a
\uxxxx
sintaxe, a primeira coisa que me vem à mente é:Outra opção seria usar
mb_convert_encoding()
ou faça uso do mapeamento direto entre UTF-16BE (big endian) e o ponto de código Unicode:
fonte
\uxxxx
sintaxe Unicode para que você possa usarjson_decode
para trabalhar em uma representação de sequência JSON criada artificialmente. Eu mudei a redação para esclarecer isso.echo json_decode('\u201B');
Quais referes a uma única citação revertidos No entanto, não está funcionando, o que significa que nenhuma saída (mesmo canalizado parahd
)echo json_decode('"\u201B"');
. Aspas duplas no símbolo unicode são obrigatórias.O PHP 7.0.0 introduziu a sintaxe "escape de ponto de código Unicode" .
Agora é possível escrever caracteres Unicode facilmente usando uma cadeia de caracteres com aspas duplas ou heredoc , sem chamar nenhuma função.
fonte
wordwrap($longLongText, 20, "\u{200B}", true);
( espaço de largura zero é)Gostaria de saber por que ninguém mencionou isso ainda, mas você pode fazer uma versão quase equivalente usando seqüências de escape em seqüências de caracteres entre aspas duplas :
Exemplo ASCII:
Portanto, para o seu caso, tudo o que você precisa fazer é
$str = "\x30\xA2";
. Mas estes são bytes , não caracteres. A representação em bytes do ponto de código Unicode coincide com o big endian UTF-16, para que possamos imprimi-lo diretamente da seguinte forma:Se você estiver usando uma codificação diferente, precisará alterar os bytes de acordo (principalmente com uma biblioteca, embora possível à mão também).
Exemplo pequeno de endian UTF-16:
Exemplo UTF-8:
Há também a
pack
função, mas você pode esperar que seja lenta.fonte
O PHP não conhece essas seqüências de escape Unicode. Mas, como as seqüências de escape desconhecidas permanecem inalteradas, você pode escrever sua própria função que converte essas seqüências de escape Unicode:
Ou com uma expressão de função anônima em vez de
create_function
:Seu uso:
fonte
Isso também funciona. No entanto, a solução json_decode () é muito mais rápida (cerca de 50 vezes).
fonte
Experimente o UTF-8 portátil :
Todos funcionam exatamente da mesma maneira. Você pode obter o ponto de código de um personagem com
utf8_ord()
. Leia mais sobre o Portable UTF-8 .fonte
Como mencionado por outros, o PHP 7 apresenta suporte para a
\u
sintaxe Unicode diretamente.Como também mencionado por outros, a única maneira de obter um valor de string a partir de qualquer descrição sensível de caracteres Unicode no PHP, é convertendo-o de outra coisa (por exemplo, análise JSON, análise HTML ou alguma outra forma). Mas isso tem um custo de desempenho em tempo de execução.
No entanto, há uma outra opção. Você pode codificar o caractere diretamente no PHP com
\x
escape binário. A\x
sintaxe de escape também é suportada no PHP 5 .Isso é especialmente útil se você preferir não inserir o caractere diretamente em uma string através de sua forma natural. Por exemplo, se é um caractere de controle invisível ou outro difícil de detectar em branco.
Primeiro, um exemplo de prova:
Observe que, conforme mencionado por Pacerier em outra resposta, esse código binário é exclusivo para uma codificação de caracteres específica. No exemplo acima,
\xE2\x80\x8A
é a codificação binária para U + 200A em UTF-8.A próxima pergunta é: como você vai
U+200A
para\xE2\x80\x8A
?Abaixo está um script PHP para gerar a sequência de escape para qualquer caractere, com base em uma sequência JSON, entidade HTML ou qualquer outro método, uma vez que você a possui como uma sequência nativa.
fonte
$ msg = '67714eac99c500200054006f006b0079006f002000530074006100740069006f006e003a0020';
echo unicode_to_textstring ($ str);
fonte