Suite

Utilisation de valueAsText, me donnant des données unicode au lieu d'une liste

Utilisation de valueAsText, me donnant des données unicode au lieu d'une liste


J'apprends Python pour créer une boîte à outils en ce moment. Lorsque j'essaie d'obtenir le paramètre, en utilisant valueAsText, la date renvoyée est unicode au lieu d'une liste que j'attendais.

Voici le code que j'utilisais :

inFeatures = parameters[0].valueAsText

J'espérais que les données d'entrée seraient stockées dans une liste de cette manière, mises lorsque j'utilise la boucle for, voici ce que j'ai :

messages.addMessage(type(inFeatures)) pour inFeature dans inFeatures : messages.addMessage(inFeature)

Il divise le chemin en caractères uniques.

Est-ce que je pourrais obtenir le résultat dans une liste?


C'est juste la façon dont python itère sur des listes et/ou des chaînes.

>>> l = ["Fred"] >>> pour i dans l : imprimer i Fred >>> l = "Fred" >>> pour i dans l : imprimer i F r e d >>>

inFeatures contient 1 élément, la chaîne "E:/Documents". Si nécessaire, créez d'abord une liste (l = []), puis ajoutez-y des éléments.


Problème avec unicode-math/fontspec dans XeTeX

Le résultat attendu doit être évident. Malheureusement, la flèche « gets » est supprimée de la sortie lorsqu'elle est rendue avec XeTeX (0.9997.4, Unicode-Math v0.5b) :

Mais encore plus étrange, lorsque je commente la ligne setmainfont et commente la ligne setmathfont, le résultat est le suivant :

c'est-à-dire que le sigma est avalé.

Résumé : lorsque j'essaie d'utiliser Asana Math ou Linux Libertine ou les deux, le texte ci-dessus ne s'affiche pas correctement.

Est-ce un bug ? Comment faire pour que cela s'affiche correctement ?

De plus, lorsque j'ai chargé "Asana Math", chargez en plus microype (2.5 beta 0.4) et afficher un texte mathématique très volumineux (par exemple, fontsize<50> <50>), le compilateur xelatex crée une erreur et ne produit aucune sortie. Voici le journal des erreurs :

thesis.tex:13 : [Font] Forme de police 'OT1/cmr/m/n' en taille <50> taille non disponible <24.88> substituée. (Page 1)
thesis.tex:13 : [Font] Forme de police 'OT1/cmr/m/n' en taille <34.99985> taille non disponible <24.88> substituée. (Page 1)
thesis.tex:13 : [Font] Forme de police `OML/cmm/m/it' en taille <50> taille non disponible <24.88> substituée. (Page 1)
thesis.tex:13 : [Font] Forme de police `OML/cmm/m/it' en taille <34.99985> taille non disponible <24.88> substituée. (Page 1)

– Je comprends cette erreur, mais pourquoi le xelatex échoue-t-il si gravement et ne produit aucune sortie ?


1 réponse 1

Le problème est que vous avez encodé une chaîne encodée UTF-8 en Base64. Ainsi, le décodage du Base64 vous restitue la séquence d'octets UTF-8 d'origine. SQL Server utilise UTF-16 Little Endian uniquement pour les données NVARCHAR, et même pour XML. Par conséquent, ù est la version 8 bits de la séquence UTF-8 à deux octets pour ù ( 0xC3 et 0xB9 ).

Heureusement, il est possible de convertir une chaîne encodée UTF-8 en UTF-16, ou même en une page de code non Unicode (SI la page de code prend en charge tous les caractères en cours de conversion). L'astuce consiste à convertir les octets décodés en Base64, dans leur représentation textuelle (même avec des caractères mal convertis) en XML. L'astuce de cette astuce est que vous devez ajouter le <?xml . > (généralement omis) et spécifiez l'encodage source :

Veuillez noter que cette astuce ne fonctionne que pour la conversion à partir de divers encodages sources dans UTF-16 Little Endian (car c'est ainsi que le type de données XML dans SQL Server stocke les chaînes en interne). Cette méthode ne peut pas être utilisée pour convertir UTF-16 en UTF-8 ou un autre codage non pris en charge par SQL Server.


3 réponses 3

Vous devez convertir l'objet dtype en chaîne unicode, comme cela est clairement mentionné dans le traceback.

Depuis la page Doc de TFIDF Vectorizer :

fit_transform(raw_documents, y=Aucun)

Paramètres : raw_documents : itérable
un itérable qui donne soit str, unicode ou alors objets de fichier

Je trouve un moyen plus efficace de résoudre ce problème.

Bien sûr, vous pouvez utiliser df['Review'].values.astype('U') pour convertir toute la série. Mais j'ai trouvé que l'utilisation de cette fonction consommerait beaucoup plus de mémoire si la série que vous souhaitez convertir est vraiment grande. (Je teste cela avec une série avec des lignes de données de 80w, et faire cet astype('U') consommera environ 96 Go de mémoire)

Au lieu de cela, si vous utilisez l'expression lambda pour convertir uniquement les données de la série de str en numpy.str_ , dont le résultat sera également accepté par la fonction fit_transform, cela sera plus rapide et n'augmentera pas l'utilisation de la mémoire.

Je ne sais pas pourquoi cela fonctionnera car dans la page Doc de TFIDF Vectorizer :

fit_transform(raw_documents, y=Aucun)

Paramètres : raw_documents : itérable

un itérable qui produit des objets str, unicode ou file


Le ResourceBundle#getBundle() utilise sous les couvertures PropertyResourceBundle lorsqu'un fichier .properties est spécifié. Celui-ci utilise à son tour par défaut Properties#load(InputStream) pour charger ces fichiers de propriétés. Selon la javadoc, ils sont par défaut lus comme ISO-8859-1.

public void load (InputStream inStream) lève IOException

Lit une liste de propriétés (paires de clés et d'éléments) à partir du flux d'octets d'entrée. Le flux d'entrée est dans un format simple orienté ligne comme spécifié dans load(Reader) et est supposé utiliser le codage de caractères ISO 8859-1 c'est-à-dire que chaque octet correspond à un caractère Latin1. Les caractères qui ne sont pas en Latin1, et certains caractères spéciaux, sont représentés dans les clés et les éléments à l'aide d'échappements Unicode tels que définis dans la section 3.3 de la spécification du langage Java™.

Donc, vous devrez les enregistrer en tant que ISO-8859-1. Si vous avez des caractères au-delà de la plage ISO-8859-1 et que vous ne pouvez pas utiliser uXXXX au-dessus de la tête et que vous êtes donc obligé d'enregistrer le fichier au format UTF-8, vous devrez alors utiliser le natif2ascii outil pour convertir un fichier de propriétés enregistré UTF-8 en un fichier de propriétés enregistré ISO-8859-1 dans lequel tous les caractères découverts sont convertis au format uXXXX. L'exemple ci-dessous convertit un fichier de propriétés encodé en UTF-8 text_utf8.properties en un fichier de propriétés encodé ISO-8859-1 valide text.properties .

Lorsque vous utilisez un IDE sain tel qu'Eclipse, cela est déjà fait automatiquement lorsque vous créez un fichier .properties dans un projet basé sur Java et utilisez le propre éditeur d'Eclipse. Eclipse convertira de manière transparente les caractères au-delà de la plage ISO-8859-1 au format uXXXX. Voir également les captures d'écran ci-dessous (notez les onglets "Propriétés" et "Source" en bas, cliquez pour agrandir) :


2 réponses 2

Vous ne devez pas publier de code (ou de messages d'erreur/d'exception, de fichiers journaux, de fichiers de configuration, de fichiers de projet ou de tout autre élément représenté sous forme de texte) sous forme d'image car :

  • Le code ou les exemples de données dans les images ne peuvent pas être copiés et collés dans un éditeur et compilés afin de reproduire le problème.
  • Les images sont volumineuses et difficiles à lire sur les appareils mobiles, et coûtent souvent aux utilisateurs mobiles des données précieuses qui sont limitées.
  • Les images sont souvent bloquées par des mandataires d'entreprise, et donc le code n'est pas disponible pour ces lecteurs. (Cela peut également s'appliquer à certains pays autres que les États-Unis qui n'autorisent pas l'accès à certains sites, y compris les sites d'images.)
  • Les images ne peuvent pas être recherchées et ne sont donc pas utiles aux futurs lecteurs.
  • Les images sont plus difficiles à lire que le texte.
  • Publier des images de votre code est plus difficile que de copier/coller le code réel et de le formater.
  • Vous nous demandez de faire du bénévolat notre temps libre pour résoudre ton problème, et vous devez nous faciliter la tâche le plus possible.
  • Les images ne peuvent pas être interprétées par les lecteurs d'écran, ce qui constitue un problème d'utilisation majeur pour les personnes malvoyantes.
  • Les URL des images hébergées deviennent souvent obsolètes et indisponibles, ce qui interrompt la capacité future de lire le message.
  • Les images montrent un nombre limité de lignes de code. Pour les questions modérément complexes, vous ne pouvez pas faire tenir tout le code requis sur un seul écran même si vous avez créé l'exemple le plus minimal possible pour reproduire le problème en question.
  • Les autres ne peuvent pas aider à améliorer votre question en corrigeant le formatage de votre code.
  • D'autres ne peuvent pas voir si une erreur dans votre code est causée par, par exemple, des caractères invisibles ou une mauvaise utilisation de caractères Unicode qui se ressemblent (comme dans ce cas).
  • Les images nécessitent plus de bande passante que le texte : un simple extrait de texte de 200 octets coûte mille fois moins de bande passante qu'une image de 200 Ko. Étant donné que Stack Overflow sert des centaines de millions de vues par jour, cette augmentation de la bande passante est importante : chaque octet et chaque milliseconde comptent.

Les images ne doivent être utilisées que pour illustrer des problèmes qui ne peuvent être clarifiés d'une autre manière, par exemple pour fournir des captures d'écran d'une interface utilisateur.

Au lieu d'utiliser des images, collez votre code réel dans votre question, sélectionnez-la et appuyez sur le bouton de code dans la barre d'outils (il ressemble à <> ) ou appuyez sur Ctrl + K . (Si vous souhaitez le formater à la main, vous pouvez insérer quatre espaces avant chaque ligne de code ou utiliser des clôtures de code.)

Les questions qui ne contiennent pas de code (uniquement des images) sont généralement fermées faute de détails de débogage. Une fois qu'ils sont édités pour inclure un exemple minimal et reproductible dans texte brut forme, ils peuvent être rouverts.


Caractères unicode invisibles LuaLaTeX

Il ne suffit pas de fournir un codage utf8 saisir. Vous devez également sélectionner des polices de texte et mathématiques qui possèdent les glyphes que vous souhaitez composer.

Comme le révèle la capture d'écran suivante, Latin Modern Roman (l'empattement par défaut du système texte font) ne comporte pas de glyphe λ, mais Latin Modern Math le fait - à la fois dans une forme inclinée et verticale. Stix Two , en revanche, possède un glyphe à la fois en texte et en mathématiques.

Vous devez charger à la fois une police et un encodage prenant en charge le grec. Dans LuaLaTeX, c'est Unicode, et vous pouvez automatiquement basculer vers votre langue et votre police grecques chaque fois que vous commencez à taper en grec.

Vous pouvez définir différentes polices pour abelfont[greek] , et Babel passera à eux lorsque vous commencerez à taper en grec en mode texte. Il utilisera les symboles de votre police mathématique Unicode en mode mathématique. Vous pouvez à la place charger Polyglossia si vous le préférez à Babel.

Mon conseil est d'utiliser LuaLaTeX et unicode-math quand vous le pouvez, et les anciennes polices 8 bits quand vous le devez. Tn PDFTeX, l'encodage de police 8 bits que vous souhaitez s'appelle LGR, et vous souhaitez également qu'alphabeta active les lettres grecques en mode texte et mathématique.

Si votre police principale ne vient pas dans LGR, vous pouvez déclarer une substitution de police avec substitutfont .

Vous obteniez l'erreur que vous avez faite parce que PDFTeX ne comprend que les caractères Unicode que vous avez configurés, et le noyau LaTeX ne configure que les caractères qui sont dans l'un des codages de police que vous avez chargés.

Si vous vérifiez votre fichier .log à partir de votre LuaLaTeX MWE d'origine, vous verrez un message d'avertissement enfoui au milieu, indiquant qu'il n'y avait pas de glyphe dans la police actuelle. En dehors de cela, TeX ignore silencieusement l'erreur. C'est une conception terrible, mais apparemment, nous sommes coincés avec elle pour des raisons de compatibilité descendante. La commande racinglostchars=2 affichera au moins l'avertissement sur la console.


Utilisez ce wiki. Il est basé sur CL_BCS, mais vous n'avez pas besoin de savoir comment fonctionne ABAP orienté objet.

Avec le paramètre CONTENTS_TXT, les lignes peuvent avoir un maximum de 255 caractères. Vous devez passer le texte en binaire comme expliqué dans ce wiki.
Principe : remplir une chaîne de caractères unique avec des lignes séparées par le caractère cl_abap_char_utilities=>cr_lf, puis appeler les modules fonction SCMS_STRING_TO_XSTRING puis SCMS_XSTRING_TO_BINARY (vous pouvez aussi simplement appeler la méthode statique CL_BCS_CONVERT=>STRING_TO_SOLIX) pour transformer votre chaîne SOLIX en table interne de type. Passez-le au paramètre CONTENTS_HEX.


4 réponses 4

Un assez facile la solution à laquelle je peux penser serait d'ajouter un "afficher les invisibles" case à cocher sur le code et les préblocs.

Avec un CSS simple et une police personnalisée* gérant ces caractères invisibles, il devrait être possible de les afficher de manière conditionnelle.

Par exemple, voici le résultat d'une telle fonctionnalité disponible dans mon éditeur de texte :

*Je ne connais malheureusement pas encore une telle police, mais il ne devrait pas être trop difficile d'en faire une.

Il s'agit d'un problème très profond dans Unicode, et supprimer les caractères de largeur zéro ne vous permet pas de le résoudre très loin. L'attaque d'homographe Swift ci-dessus est facilement générée sans aucune largeur :

Il existe de nombreux homographes en Unicode, et encore plus de quasi-homographes. L'utilisation d'homographes est une version plus facile et moins détectable de cette attaque, car ils ne créent pas les comportements IDE bizarres que font les largeurs nulles. S'il s'agissait d'une attaque fructueuse, nous devrions le voir dans les attaques d'homographes. Cela ne veut pas dire qu'il est impossible à exploiter ou inutile à atténuer, mais lorsque les attaquants ne parviennent pas à utiliser largement une classe d'attaque connue depuis des années, il y a une raison. L'exploitation par homographe des noms de domaine est un problème majeur, ce n'est donc pas un cas que les attaquants ignorent les possibilités.

Existe-t-il des cas connus d'attaques d'homographes réussies sur Stack Overflow, des forums de codage ou d'autres sites de codage ? « Personne n'a été pris en train de le faire » n'est pas en soi une raison suffisante pour ne pas recourir à une mesure d'atténuation, mais si quelqu'un possède réussi à le faire, alors cela change définitivement les choses.

Réduire les questions de débordement de pile à Latin-1 rendrait impossible la pose d'une grande variété de questions Unicode. (Sans parler de l'impact sur les demandeurs qui utilisent des identifiants et des commentaires non latins dans leur code. Je rencontre souvent des exemples de code non anglais, et c'est très bien IMO.) Je pense que ce n'est pas un début.

Supprimer les caractères de largeur zéro dans le Markdown peut être acceptable, car ils peuvent rendre la question plus difficile à comprendre, et il est souvent préférable d'exprimer les questions à leur sujet avec des noms visibles (comme "ZWJ"). Mais j'ai répondu à des questions où le problème s'est avéré être des choses étranges dans la chaîne que j'ai dû coller dans xxd pour comprendre. Dans tous les cas, ce n'est pas vraiment une atténuation de sécurité car les homographes sont tellement plus faciles.

Une bannière indiquant que le message inclut des caractères non latins-1 et un mécanisme pour les mettre en évidence (et exposer ceux qui sont de largeur zéro) offrirait un certain avantage en matière de sécurité à l'OMI, mais cela semble gênant et quelque peu hostile aux non- anglophones natifs. Je ne le recommande pas, mais au moins ça pourrait être efficace.


12. Comment savoir quels classements utiliser ?

La solution idéale consiste à choisir un classement lors de la configuration de SQL Server qui peut être utilisé pour toutes vos bases de données utilisateur et colonnes de caractères. L'utilisation d'un classement supprime tous les problèmes que vous pourriez rencontrer lors de l'interrogation des données de différentes manières. Cela peut également être la meilleure approche en termes de performances si plusieurs classements ont un impact sur vos requêtes. Cependant, cette approche ne fonctionne que si les mêmes paramètres de langue et de classement sont appropriés pour tous vos utilisateurs et applications&mdashor au moins une bonne majorité d'entre eux.

Si vous prenez en charge des environnements multiculturels, vous devez prendre en compte un certain nombre de considérations. Pour commencer, vous devez choisir des classements qui prennent en charge le plus grand nombre d'utilisateurs, et vous devez utiliser les types de données Unicode dans la mesure du possible car ils peuvent aider à éviter les problèmes de conversion de page de code. Gardez simplement à l'esprit les exigences de stockage qui viennent avec Unicode & rsquos deux octets par caractère.

Lorsque vous implémentez des types de données Unicode, vous avez la possibilité d'utiliser des classements Unicode uniquement pour vos colonnes et requêtes. Ce type de classement peut être utile lorsque vous prenez en charge les applications clientes installées sur des systèmes d'exploitation plus anciens ou lorsque les applications ou les pilotes clients ne reconnaissent pas les nouveaux classements Windows. Étant donné que les classements Unicode uniquement n'utilisent pas de pages de codes, les applications n'essayeront pas de mapper des modèles de bits incorrects ou d'adhérer à des règles contradictoires. Au lieu de cela, le client et le serveur traitent toutes les données de caractères selon les normes Unicode.

Cependant, l'utilisation de types de données Unicode avec des classements Unicode uniquement n'est pas toujours une option, auquel cas, vous devrez peut-être sélectionner vos classements en fonction de vos applications clientes ou de leurs environnements. Par exemple, vous pouvez choisir les classements SQL Server car ils peuvent prendre en charge les systèmes hérités. Selon les circonstances, une bonne stratégie peut consister à affecter un classement SQL Server au serveur ou au moins aux bases de données utilisateur, selon le cas.

Bien sûr, vous devez mettre à niveau le système d'exploitation client, l'application ou le fournisseur, lorsque cela est possible, mais cela peut ne pas toujours être une solution pratique.

Si vous développez une toute nouvelle application pilotée par les données, vous devez vous en tenir aux classements Windows, en implémentant des types de données Unicode et des classements Unicode uniquement si et quand ils ont du sens. Mais assurez-vous de garder à l'esprit les performances et la maintenance, en particulier lorsque vous mélangez des données Unicode et non Unicode (ou des données à un et deux octets) ou lorsque vos requêtes entraînent des conversions de pages de codes entre le client et le serveur.

En fin de compte, vous devez garder vos applications clientes et vos utilisateurs au premier plan de votre réflexion lors du choix des classements. Vous devez également vous efforcer de garder les choses aussi simples que possible. Plus vous affectez de classements à une base de données, plus le moteur de base de données peut avoir du mal à travailler. Pour les ensembles de données volumineux, vous devez tester divers scénarios pour déterminer leur impact sur les performances, la maintenance et le stockage, et assurez-vous de regarder où les conversions de pages de codes peuvent se produire et où des conflits peuvent survenir.

Vous avez d'autres questions que vous étiez trop timide pour poser ?

Des statistiques à la sécurité, des pivots à PowerShell, nous avons posé les questions délicates et évidentes pour que vous n'ayez pas à le faire.
Voir les autres sujets