代码之家  ›  专栏  ›  技术社区  ›  Ringil

.NET标准F库无法正确存储非英文字符

  •  5
  • Ringil  · 技术社区  · 7 年前

    我使用F 4.3.4创建了一个.NET标准F库(我也使用4.5进行了测试),代码如下:

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

    从另一个项目(.net core或.net framework)引用该库时:

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

    我得到以下输出:

    2
    [|65533; 65533|]
    False
    

    等效的C.NET标准库:

    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 .

    这看起来可能是个bug,但我想知道这个问题的合理解决方案是什么?具体来说,我希望能够检查字符串的相等性,比如 Say.c = "国" 在使用.NET标准库时,我可能会使用非英文字符。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Ringil    7 年前

    因此,问题似乎是dotnet cli在f库中生成的第一个文件没有使用unicode进行编码。因此,在创建.NET标准F库时,该文件是使用SHIFT JIS编码生成的,这可能是由于我自己计算机上的区域设置所致。因此,解决我的问题的方法是简单地保存默认值 Library1.fs 手动使用utf-8编码的文件,以便其编码与所有其他文件相同。