GNU/Linux >> Tutoriels Linux >  >> Linux

Affirmez vos hypothèses - .NET Core et problèmes de paramètres régionaux subtils avec WSLs Ubuntu

Je pensais que c'était un bug intéressant et subtil comportement qui était non seulement difficile à traquer, mais difficile à cerner. Je n'étais pas sûr de "la faute de qui".

Voici l'histoire. N'hésitez pas à suivre et à voir ce que vous obtenez.

J'étais sous Ubuntu 18.04 sous WSL.

J'ai créé une application console à l'aide de .NET Core 3.0. Vous pouvez installer .NET Core ici http://dot.net/get-core3

J'ai fait ceci :

dotnet new console
dotnet add package Humanizer --version 2.6.2

Ensuite, Program.cs ressemble à ceci. Humanizer est une excellente bibliothèque .NET Standard sur laquelle vous apprendrez et vous vous demanderez "pourquoi .NET n'a-t-il pas toujours eu ça ! ?"

using System;
using Humanizer;

namespace dotnetlocaletest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(3501.ToWords());
}
}
}

Vous pouvez voir que je veux que l'application imprime le nombre 3051 sous forme de mots. Vraisemblablement en anglais, car c'est ma langue principale, mais vous remarquerez que je ne l'ai pas indiqué ici. Exécutons-le.

Notez que cette application fonctionne très bien et comme prévu sous Windows.

scott@IRONHEART:~/dotnetlocaletest$ dotnet run
3501

Hein. Il n'a même pas essayé. C'est bizarre.

Ma machine Windows est en-us (anglais aux États-Unis) mais quelle est ma machine Ubuntu ?

scott@IRONHEART:~/dotnetlocaletest$ locale
LANG=C.UTF-8
LANGUAGE=

On dirait que ce n'est rien. C'est "C.UTF-8" et ce n'est rien. C dans ce contexte signifie la localisation par défaut de POSIX. C'est le plus basique. C.UTF-8 n'est certainement PAS le même que en_US.utf8. C'est une sorte de localisation, mais ce n'est pas un endroit.

Et si je dis explicitement à .NET où je suis ?

static void Main(string[] args)
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
Console.WriteLine(3501.ToWords());
}

Et l'exécuter.

scott@IRONHEART:~/dotnetlocaletest$ dotnet run
three thousand five hundred and one

OK, donc les choses fonctionnent bien si l'application déclare "hey I'm en-US!" et Humanizer fonctionne bien.

Qu'est-ce qui ne va pas? On dirait que le "C.UTF-8" d'Ubuntu n'est pas suffisamment "invariant" pour que Humanizer revienne à une valeur par défaut en anglais ?

Il semble que d'autres personnes aient rencontré des problèmes inhabituels ou subtils avec les installations d'Ubuntu qui utilisent C.UTF-8 par rapport à des paramètres régionaux plus spécifiques comme en-US.UTF8.

Je pourrais résoudre ce problème de plusieurs façons. Je pourrais définir les paramètres régionaux spécifiquement dans Ubuntu :

locale-gen en_US.UTF-8
update-locale LANG=en_US.UTF-8

Heureusement, Humanizer 2.7.2 et supérieur a résolu ce problème et revient correctement. A qui était ce "bug" ? Difficile, mais dans ce cas, Humanizer avait une logique de repli défectueuse. J'ai mis à jour vers 2.7.2 et maintenant C.UTF-8 revient à un anglais neutre.

Cela dit, je pense que l'on pourrait faire valoir que WSL/Canonical/Ubuntu devrait détecter ma langue locale et/ou lui définir des paramètres régionaux lors de l'installation.

La leçon ici est que vos applications - en particulier celles qui sont censées fonctionner dans plusieurs paramètres régionaux dans plusieurs langues - reçoivent des "entrées" de nombreux endroits différents. En d'autres termes, toutes les entrées ne proviennent pas de l'utilisateur.

Les paramètres régionaux et la langue du système, l'heure, le fuseau horaire, les dates sont tous entrés en tant que contexte ambiant dans votre application. Assurez-vous d'affirmer vos hypothèses sur ce qu'est "par défaut". Dans ce cas, ma petite application fonctionnait très bien sur en-US mais pas sur "C.UTF-8". J'ai pu explorer le comportement et apprendre qu'il existait à la fois une solution de contournement locale (je pouvais détecter et définir un paramètre régional par défaut si nécessaire) et qu'un correctif de bibliothèque était également disponible.

Affirmez vos hypothèses !

Parrain : Vous souffrez d'un manque de clarté autour des bugs logiciels ? Offrez à vos clients l'expérience qu'ils méritent et attendent avec la surveillance des erreurs de Raygun.com. S'installe en quelques minutes, essayez-le dès aujourd'hui !


Linux
  1. Contrôlez l'heure et la date de votre ordinateur avec systemd

  2. Nginx avec libmodsecurity et OWASP ModSecurity Core Rule Set sur Ubuntu 16.04

  3. Enregistrez votre terminal avec script et scriptreplay

  4. Comment installer Node.js avec NVM et Nginx sur Ubuntu 22.04

  5. Personnalisez l'apparence de votre ordinateur portable Ubuntu avec des thèmes

Installer et utiliser Docker Compose avec Docker sur Ubuntu 22.04

Premiers pas avec .NET Core et Docker et le registre de conteneurs Microsoft

.NET Core et Docker

.NET et Docker

Explorer ASP.NET Core avec Docker dans les conteneurs Linux et Windows

Ajoutez facilement des en-têtes de sécurité à votre application Web ASP.NET Core et obtenez une note A