GNU/Linux >> Belajar Linux >  >> Linux

Tegaskan asumsi Anda - .NET Core dan masalah lokal halus dengan WSL Ubuntu

Saya pikir ini adalah bug yang menarik dan halus perilaku yang tidak hanya sulit untuk dilacak tetapi juga sulit untuk dijabarkan. Saya tidak yakin 'salah siapa.'

Berikut ceritanya. Jangan ragu untuk mengikuti dan melihat apa yang Anda dapatkan.

Saya menjalankan Ubuntu 18.04 di bawah WSL.

Saya membuat aplikasi konsol menggunakan .NET Core 3.0. Anda dapat menginstal .NET Core di sini http://dot.net/get-core3

Saya melakukan ini:

dotnet new console
dotnet add package Humanizer --version 2.6.2

Kemudian buat Program.cs menjadi seperti ini. Humanizer adalah .NET Standard library yang hebat yang akan Anda pelajari dan pikirkan "mengapa .NET tidak selalu memiliki ini!?"

using System;
using Humanizer;

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

Anda dapat melihat bahwa saya ingin aplikasi mencetak angka 3051 sebagai kata-kata. Agaknya dalam bahasa Inggris, karena itu bahasa utama saya, tetapi Anda akan perhatikan bahwa saya belum menunjukkannya di sini. Mari kita jalankan.

Perhatikan bahwa aplikasi ini berfungsi dengan baik dan seperti yang diharapkan di Windows.

scott@IRONHEART:~/dotnetlocaletest$ dotnet run
3501

Hah. Itu bahkan tidak mencoba. Itu aneh.

Mesin Windows saya adalah en-us (Bahasa Inggris di AS) tetapi apa mesin Ubuntu saya?

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

Sepertinya tidak apa-apa. Ini "C.UTF-8" dan bukan apa-apa. C dalam konteks ini berarti lokasi default POSIX. Itu yang paling dasar. C.UTF-8 jelas TIDAK sama dengan en_US.utf8. Ini semacam lokasi, tapi itu bukan tempat.

Bagaimana jika saya memberi tahu .NET secara eksplisit di mana saya berada?

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

Dan menjalankannya.

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

Oke, jadi semuanya berfungsi dengan baik jika aplikasi menyatakan "hei saya en-US!" dan Humanizer bekerja dengan baik.

Apa yang salah? Sepertinya "C.UTF-8" Ubuntu tidak cukup "invarian" untuk menyebabkan Humanizer kembali ke default bahasa Inggris?

Sepertinya orang lain telah melihat masalah yang tidak biasa atau halus dengan penginstalan Ubuntu yang menggunakan C.UTF-8 versus lokal yang lebih spesifik seperti en-US.UTF8.

Saya bisa memperbaiki ini dalam beberapa cara. Saya dapat mengatur lokal secara khusus di Ubuntu:

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

Untungnya Humanizer 2.7.2 dan di atasnya telah memperbaiki masalah ini dan kembali dengan benar. "Bug" siapa itu? Yang sulit tetapi dalam kasus ini, Humanizer memiliki beberapa logika mundur yang cacat. Saya memperbarui ke 2.7.2 dan sekarang C.UTF-8 kembali ke bahasa Inggris yang netral.

Yang mengatakan, saya pikir dapat dikatakan bahwa WSL/Canonical/Ubuntu harus mendeteksi bahasa lokal saya dan/atau menyetel lokal ke sana saat instalasi.

Pelajarannya di sini adalah bahwa aplikasi Anda - terutama yang diharapkan bekerja di banyak lokal dalam berbagai bahasa - mengambil "input" dari banyak tempat berbeda. Dengan frasa yang berbeda, tidak semua masukan berasal dari pengguna.

Lokal dan bahasa sistem, waktu, zona waktu, tanggal, semuanya dimasukkan sebagai konteks sekitar untuk aplikasi Anda. Pastikan Anda menegaskan asumsi Anda tentang apa itu "default". Dalam hal ini, aplikasi kecil saya bekerja dengan baik di en-US tetapi tidak pada "C.UTF-8." Saya dapat menjelajahi perilaku dan mengetahui bahwa ada solusi lokal (saya dapat mendeteksi dan menyetel lokal default jika diperlukan) dan juga ada perbaikan pustaka yang tersedia.

Tegaskan asumsi Anda!

Sponsor: Menderita karena kurangnya kejelasan seputar bug perangkat lunak? Berikan pelanggan Anda pengalaman yang pantas dan diharapkan dengan pemantauan kesalahan dari Raygun.com. Instal dalam hitungan menit, coba hari ini!


Linux
  1. Kontrol waktu dan tanggal komputer Anda dengan systemd

  2. Nginx dengan libmodsecurity dan OWASP ModSecurity Core Rule Ditetapkan di Ubuntu 16.04

  3. Sesuaikan Penampilan Laptop Ubuntu Anda dengan Tema

  1. Rekam terminal Anda dengan skrip dan pemutaran ulang skrip

  2. Cara Menginstal Node.js dengan NVM dan Nginx di Ubuntu 22.04

  3. GDB dan masalah dengan core dumps

  1. Tingkatkan riwayat cangkang Anda dengan Loki dan fzf

  2. Menjalankan aplikasi ASP.NET Core mandiri di Ubuntu

  3. Cara menulis daemon linux dengan .Net Core