让 Raylib-cs 在 windows 中使用 128 以上的扩展 ascii / unicode?
Making Raylib-cs work with extended ascii / unicode above 128 in windows?
我正在向高中生教授 C# 和游戏开发,我们使用 Raylib-cs 作为对图形 API 和库的简单介绍。
我们遇到了一个小问题:我们是瑞典人,我们想使用一些特殊的 non-ascii 字母 – 即 å、ä 和 ö(很多瑞典语单词都使用它们)。但是,我无法 Raylib-cs 显示代码点 127 以上的任何内容 – 至少不使用 DrawText。
相反,我得到的只是?.
这是在 Windows 10、64 位、20H2 上。使用 dotnet 5(最新),主要是作为 nuget 包提供的 Raylib-cs。
到目前为止我尝试过的:
- DrawText 和 DrawTextEx。同样的结果。
- 加载不同的字体,有或没有明确包含最多 255 个代码点。结果相同。
- 从 github 页面获取最新的 Raylib-cs。同样的结果。
- 运行 相同的代码,但在虚拟 Debian 机器中。这有效,所以问题似乎在 Windows.
- 请精通C/C++的朋友尝试在C++中使用åäö using Raylib。这个有效,所以这个问题似乎是 Raylib-cs 特有的,即使它只是一个包装器?
- DrawTextCodepoint。这有效,这意味着由于某种原因,该问题特定于 DrawText 方法(和 InitWindow)。 Raylib应该是Unicode-capable,这证明至少在理论上是。
这是我的简单测试代码(只写出字符 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();
}
}
结果 windows(至少对我而言):Window 标题栏是“???”,第二列以外的所有字符也是如此。
debian 中的结果:Window 标题栏是“åäö”,所有字符都按应有的方式绘制。
有人遇到过这个问题吗?有人有(测试过的)解决方案吗?
C# 在 windows 上如何处理字符串或其他方面是否存在一些已知的怪癖?
库导入的方式DrawText
有问题;它的默认行为“编组”字符串值以适应旧字符编码,不一定是 UTF-8:https://github.com/ChrisDill/Raylib-cs/blob/b1f46d33071387800559523950aa131448251461/Raylib-cs/Raylib.cs#L2116(指定 CharSet=Unicode 可能无济于事,因为 DrawText 函数不使用宽字符字符串,但是相当普通的 char* 指针解释为 UTF-8。)
我看到你有 posted an issue 到 GitHub 存储库。幸运的是,该库的作者提出了两种解决方法。正如他们所说,其中之一是:“使用 [MarshalAs(UnmanagedType.LPUTF8Str)]
将字符串编组为 UTF8。”
我正在向高中生教授 C# 和游戏开发,我们使用 Raylib-cs 作为对图形 API 和库的简单介绍。
我们遇到了一个小问题:我们是瑞典人,我们想使用一些特殊的 non-ascii 字母 – 即 å、ä 和 ö(很多瑞典语单词都使用它们)。但是,我无法 Raylib-cs 显示代码点 127 以上的任何内容 – 至少不使用 DrawText。
相反,我得到的只是?.
这是在 Windows 10、64 位、20H2 上。使用 dotnet 5(最新),主要是作为 nuget 包提供的 Raylib-cs。
到目前为止我尝试过的:
- DrawText 和 DrawTextEx。同样的结果。
- 加载不同的字体,有或没有明确包含最多 255 个代码点。结果相同。
- 从 github 页面获取最新的 Raylib-cs。同样的结果。
- 运行 相同的代码,但在虚拟 Debian 机器中。这有效,所以问题似乎在 Windows.
- 请精通C/C++的朋友尝试在C++中使用åäö using Raylib。这个有效,所以这个问题似乎是 Raylib-cs 特有的,即使它只是一个包装器?
- DrawTextCodepoint。这有效,这意味着由于某种原因,该问题特定于 DrawText 方法(和 InitWindow)。 Raylib应该是Unicode-capable,这证明至少在理论上是。
这是我的简单测试代码(只写出字符 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();
}
}
结果 windows(至少对我而言):Window 标题栏是“???”,第二列以外的所有字符也是如此。 debian 中的结果:Window 标题栏是“åäö”,所有字符都按应有的方式绘制。
有人遇到过这个问题吗?有人有(测试过的)解决方案吗?
C# 在 windows 上如何处理字符串或其他方面是否存在一些已知的怪癖?
库导入的方式DrawText
有问题;它的默认行为“编组”字符串值以适应旧字符编码,不一定是 UTF-8:https://github.com/ChrisDill/Raylib-cs/blob/b1f46d33071387800559523950aa131448251461/Raylib-cs/Raylib.cs#L2116(指定 CharSet=Unicode 可能无济于事,因为 DrawText 函数不使用宽字符字符串,但是相当普通的 char* 指针解释为 UTF-8。)
我看到你有 posted an issue 到 GitHub 存储库。幸运的是,该库的作者提出了两种解决方法。正如他们所说,其中之一是:“使用 [MarshalAs(UnmanagedType.LPUTF8Str)]
将字符串编组为 UTF8。”