2011-08-10 3 views
0

J'utilise Ruby 1.8.7 (et la mise à niveau n'est pas une option). Je voudrais créer une chaîne de tous les points de code UTF-8 de 0 à 127, écrit comme "\ uXXXX".Encodage UTF-8 en Ruby en utilisant une variable

Mon problème est que cela est interprété comme (par exemple): 'u0008'. Si j'essaie d'utiliser '\ u0008', la chaîne devient "\ u0008", ce qui n'est PAS ce que je veux.

J'ai essayé de nombreuses façons différentes, mais il semble impossible de créer une chaîne qui soit exactement "\ uXXXX" ie. "\ u000B". c'est toujours "\ u000B" ou "u000B"

Il n'est pas possible d'échapper le '\'. J'ai besoin d'envoyer une chaîne à un serveur, de sorte que le serveur recevra '\ u000B' par exemple. C'est ainsi que l'autre serveur peut tester son analyse de la syntaxe \ uXXXX. Cela semble toutefois impossible à faire dans Ruby.

heureux si quelqu'un peut me prouver :)

+0

Juste pour que cela soit clair: Les points de code UTF-8 de 0 à 127 sont exactement les mêmes que pour ASCII. Vous n'avez pas besoin de passer par des étapes compliquées pour les créer. – deceze

+0

Que voulez-vous exactement que le résultat attendu soit? Veuillez fournir un échantillon des données que vous recherchez. – Casper

+0

Pour clarifier, ce que je m'attends réellement à avoir une valeur, par exemple: "U + 1 = \ u0001, hex = \ x01, U + 117 = \ u0075, hex = \ x75" – Robin

Répondre

2

Utilisez Integer #chr pour obtenir le caractère. Voici une version propre:

(1..127).each do |i| 
    value << "U+#{i} = #{i.chr}, hex = \\x#{"%02x" % i}; " 
end 

Le "%02x" % i est égal à sprintf("%02x", i). Il renvoie l'entier sous la forme d'un nombre hexadécimal à deux chiffres.

sortie Echappé (voir les commentaires):

(1..127).each do |i| 
    value << "U+#{i} = \\u#{"%04x" % i}, hex = \\x#{"%02x" % i}; " 
end 
+0

Oui cela fonctionne. Je voudrais ajouter que pour les points de code inférieurs à 128, ASCII et UTF-8 sont identiques donc il n'y a pas besoin de s'inquiéter de Unicode ou ruby ​​1.9.2. –

+0

Pour clarifier, ce que je m'attends en fait à avoir une valeur, par exemple: "U + 1 = \ u0001, hex = \ x01, U + 117 = \ u0075, hex = \ x75". Ce qui précède me donne "U + 1 = \ 0001, hex = \\ x01, U + 117 = \ 0075, hex = \\ x75" ce qui n'est pas ce que je veux. J'ai besoin du \ u parce que j'ai besoin que les chaînes soient JSON échappées. – Robin

+0

Aussi, pour ajouter à cela, je ne peux pas utiliser "\ x" << str car j'obtiens un avertissement à propos d'une séquence de caractères d'échappement invalide. Mais si j'utilise '\ x' << str, j'obtiens \\ x et la chaîne n'est pas correctement convertie en hexadécimal – Robin