使 Raylib-cs 在 Windows 中与 128 以上的扩展 ascii / unicode 一起工作?

Posted

技术标签:

【中文标题】使 Raylib-cs 在 Windows 中与 128 以上的扩展 ascii / unicode 一起工作?【英文标题】:Making Raylib-cs work with extended ascii / unicode above 128 in windows? 【发布时间】:2021-01-14 09:48:26 【问题描述】:

我正在向高中生教授 C# 和游戏开发,我们使用 Raylib-cs 作为图形 API 和库的简单介绍。

我们遇到了一个小问题:我们是瑞典人,我们想使用一些特殊的非 ascii 字母——即 å、ä 和 ö(很多瑞典语单词都使用它们)。但是,我无法让 Raylib-cs 显示代码点 127 以上的任何内容——至少不使用 DrawText。

相反,我得到的只是?。

这是在 Windows 10、64 位、20H2 上。使用 dotnet 5(最新),主要是作为 nuget 包提供的 Raylib-cs。

到目前为止我已经尝试过:

DrawText 和 DrawTextEx。结果相同。 加载不同的字体,无论是否明确包含最多 255 个代码点。结果相同。 从 github 页面获取最新的 Raylib-cs。结果相同。 在虚拟 Debian 机器上运行相同的代码。这可行,所以问题似乎出在 Windows 中。 请精通C/C++ 的朋友尝试使用åäö using Raylib in C++。这有效,所以问题似乎是 Raylib-cs 特有的,即使它只是一个包装器? 绘制文本代码点。这有效,这意味着由于某种原因,该问题特定于 DrawText 方法(和 InitWindow)。 Raylib 应该是支持 Unicode 的,这证明至少在理论上是支持的。

这是我的简单测试代码(只写出字符 0-255):

static void Main(string[] args)

  int font_size = 10;
  Raylib.InitWindow(800, font_size * 64, "åäö");
  while (!Raylib.WindowShouldClose())
  
    Raylib.BeginDrawing();
    Raylib.ClearBackground(Color.BEIGE);
    for (int i = 0; i < 255; i++)
    
      int col = i / 64;
      int x = col * 200;
      int y = (i % 64) * font_size;
      string text = i.ToString() + " | " + ((char)i).ToString();

      Raylib.DrawText(text, x, y, font_size, Color.BLACK);
    
    Raylib.EndDrawing();
  

窗口中的结果(至少对我而言):窗口标题栏是“???”,第二列之外的所有字符也是如此。 debian 中的结果:窗口标题栏为“åäö”,所有字符都按应有的方式绘制。

有人遇到过这个问题吗?有人得到(经过测试的)解决方案吗?

在 C# 如何专门在 Windows 上处理字符串或其他方面是否存在一些已知的怪癖?

【问题讨论】:

这能回答你的问题吗? DllImport - ANSI vs. Unicode 库导入DrawText的方式有问题;它的默认行为“编组”string 值以适应传统字符编码,不一定是 UTF-8:github.com/ChrisDill/Raylib-cs/blob/…。 (指定CharSet=Unicode 可能无济于事,因为DrawText 函数不使用宽字符串,而是使用普通的char* 指针解释为UTF-8。)您应该将此问题报告给Raylib-cs 的问题页面. 谢谢@PeterO!我已听从您的建议,并将问题报告给 Raylib-cs 的 github 页面。 【参考方案1】:

库导入DrawText的方式有问题;它的默认行为“编组”字符串值以适应传统字符编码,不一定是 UTF-8:https://github.com/ChrisDill/Raylib-cs/blob/b1f46d33071387800559523950aa131448251461/Raylib-cs/Raylib.cs#L2116(指定 CharSet=Unicode 可能无济于事,因为 DrawText 函数不使用宽字符串,而是普通的char* 指针被解释为 UTF-8。)

我看到您在 GitHub 存储库中有 posted an issue。幸运的是,图书馆的作者提出了两种解决方法。正如他们所说,其中之一是:“使用[MarshalAs(UnmanagedType.LPUTF8Str)] 将字符串编组为UTF8。”

【讨论】:

以上是关于使 Raylib-cs 在 Windows 中与 128 以上的扩展 ascii / unicode 一起工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 ExceptionNotifier 在 Rails 3 中与延迟作业一起使用?

在Windows7中与虚拟机实现远程桌面连接

在 Linux 和 Windows 中与 c# 集成的跨平台 c++

如何让 Assetic + sass 在 Windows 中与 Symfony2 一起工作?

CMD START不能在Windows 8中与处理器关联使用

如何让Coldfusion 10在Windows 10中与IIS 10一起使用