Библиотека .NET Standard F # неправильно хранит неанглийские символы - PullRequest
0 голосов
/ 10 июня 2018

Я создаю .NET Standard F # библиотеку с F # 4.3.4 (я также тестировал с 4.5) со следующим кодом:

namespace ClassLibrary2

module Say =
    let a = "国".Length.ToString()
    let b = sprintf "%A" ("国".ToCharArray() |> Array.map int)
    let c = "国"

При ссылке на эту библиотеку из другого проекта (ядро .net или.net framework):

Console.WriteLine(Say.a); // F# .net standard
Console.WriteLine(Say.b);
Console.WriteLine(Say.c == "国");

Я получаю следующий вывод:

2
[|65533; 65533|]
False

Эквивалентная библиотека C # .NET Standard:

using System;
using System.Linq;

namespace ClassLibrary1
{
    public static class Class1
    {
        public static string a = "国".Length.ToString();
        public static string b = String.Join(", ", "国".ToCharArray().Select(i => ((int)i).ToString()));
        public static string c = "国";
    }
}

дает ожидаемый результат:

1 
22269
True

Вот репозиторий, показывающий проблему: https://github.com/liboz/Kanji-Bug.

Вероятно, это будет ошибкой, но мне было интересно, что будет разумным решением этой проблемы?В частности, я хочу иметь возможность проверять равенство строк с чем-то вроде Say.c = "国", где я могу использовать неанглийские символы при использовании библиотеки .NET Standard.

1 Ответ

0 голосов
/ 13 июня 2018

Итак, проблема заключается в том, что первый файл, который генерирует dotnet cli в библиотеке F #, не использует Unicode для своей кодировки.Таким образом, при создании библиотеки .NET Standard F # этот файл был сгенерирован с использованием кодировки Shift-JIS, вероятно, из-за настроек региона на моем собственном компьютере.Поэтому решение моей проблемы состояло в том, чтобы просто сохранить файл по умолчанию Library1.fs с кодировкой UTF-8 вручную, чтобы он имел ту же кодировку, что и все остальные файлы.

...