2017-08-14 1 views
0

gratté Je suis en train de traiter un certain HTML et il y avait quelques personnages étranges (qui donnent un saut de ligne lorsque j'utilise la commande d'impression) donc je l'ai fait ce qui suit:Changer impairs (très élevé) caractères ASCII en HTML

d.each_char do |c|; puts c + " " + c.ord.to_s; end 

J'ai trouvé que c'était un personnage avec un ord de 9644. Il semble que ce soit un rectangle noir Unicode. Il y a aussi un ASCII 219 qui semble similaire, donc je voulais le mapper à ce code ASCII. J'ai essayé:

d = d.gsub(9644.chr, 219.chr) 

Cela m'a donné une erreur "Exception: RangeError: 9644 hors de portée de char".

Est-il possible que je peux le faire (par exemple changer tous ord.9644 à ord.219.

Sinon je peux changer tous les caractères ASCII sur 255 à « ? », Même si je peux il serait bon de savoir comment faire

Cordialement, Ben

+0

Pourquoi devez-vous remplacer les caractères? – Stefan

+0

[ASCII] (https://en.wikipedia.org/wiki/ASCII) est un jeu de caractères de 7 bits avec des codes 0-127. Il y a aussi [extended ASCII] (https://en.wikipedia.org/wiki/Extended_ASCII) qui est un terme générique pour divers codages à 8 bits, c'est-à-dire ASCII plus les points de code 128-255. Veuillez spécifier l'encodage auquel vous faites référence. – Stefan

+0

Vous devez connaître l'encodage du document HTML. Il peut s'agir d'une balise meta charset ou, si elle est fournie via HTTP, d'un en-tête Content-Type qui indique le codage à utiliser pour le lire. Peu importe, vous devez le lire avec l'encodage avec lequel il a été écrit. Si vous n'êtes pas dit explicitement ou par spécification, convention ou autrement, c'est une perte de données. –

Répondre

0

Que diriez-vous.

d.chars.map(&:ord).map { |int| int == 9644 ? 219 : int }.map(&:chr).join 

Si vous voulez simplement remplacer toutes les valeurs élevées avec ?, puis utiliser cette place:

high_limit = 999 # Use whatever integer your `#chr` method can handle 
d.chars.map(&:ord).map { |int| int > high_limit ? 255 : int }.map(&:chr).join 

Le procédé #chars rompt une chaîne vers le haut dans un tableau de caractères individuels, puis map(&:ord) le convertit en un tableau d'entiers représentant les codes UTF-8. Le map avec le bloc conditionnel remplace chaque occurrence de 9644 par 219 et laisse les autres entiers intacts. Enfin, nous mappons les entiers à des caractères uniques avec map(&:chr), puis rejoignons le tableau de caractères résultant dans une chaîne. Notez que ce code crée quelques tableaux le long du chemin, dont chacun est égal en taille à la longueur de la chaîne d'origine, de sorte que l'utiliser sur de très grandes chaînes peut consommer une bonne quantité de mémoire. Si c'est le cas, vous pouvez remplacer map par map! pour modifier le tableau en place.

+0

Nice mais j'ai peur qu'il donne encore une erreur, 'Exception: RangeError: 8220 hors de la gamme char'; ( –

+0

Intéressant. Je suis en mesure de faire 8220.chr sans erreur.Quelle version de Ruby courez-vous? Dans tous les cas, je développerai la réponse pour inclure une version qui changera les valeurs élevées à 255 comme vous le suggérez ci-dessus: – moveson

+0

ruby ​​2.3.1p112 (2016-04-26) [x86_64-linux-gnu]. –