我在 Windows 11 的 Visual Studio Code 中使用 Rust 时遇到瑞典国家字符问题。可以通过以下程序显示:
\nfn main() {\nlet abc = " \xc3\xa5\xc3\xa5\xc3\xa5\n\xc3\xb6\xc3\xb6\xc3\xb6\n\xc3\xa4\xc3\xa4\xc3\xa4";\nprintln!("<---{}--->", abc);\n}\nRun Code Online (Sandbox Code Playgroud)\n当使用命令行从命令行运行程序时cargo run,输出如下:
<--- \xc3\xa5\xc3\xa5\xc3\xa5\n \xc3\xb6\xc3\xb6\xc3\xb6\n \xc3\xa4\xc3\xa4\xc3\xa4--->\nRun Code Online (Sandbox Code Playgroud)\n奇怪的是,第 2 行和第 3 行的开头添加了空格。但是,当程序在 Visual Studio Code 中运行时,瑞典语字符会变形。
\n<--- \xe2\x94\x9c\xc3\x91\xe2\x94\x9c\xc3\x91\xe2\x94\x9c\xc3\x91\n \xe2\x94\x9c\xe2\x95\xa2\xe2\x94\x9c\xe2\x95\xa2\xe2\x94\x9c\xe2\x95\xa2\n \xe2\x94\x9c\xc3\xb1\xe2\x94\x9c\xc3\xb1\xe2\x94\x9c\xc3\xb1--->\nRun Code Online (Sandbox Code Playgroud)\n我该如何解决?我从事文本处理工作,这是一个主要问题。
\n编辑:由于该问题不会出现在许多系统上,因此我添加了技术数据:Windows 11 Pro Version 10.0.22621 Build 22621;\nVisual Studio Code Version: 1.73.1 (user setup) Date: 2022-11-09 Chromium :102.0.5005.167 Node.js:16.14.2 沙盒:否。
\ncharacter-encoding non-ascii-characters rust visual-studio-code
以下测试程序无法编译:
fn f1( string: String) {
println!("{}", string );
}
fn f2( string: String) {
println!("{}", string );
}
fn main() {
let my_string: String = "ABCDE".to_string();
f1( my_string );
f2( my_string );
}
Run Code Online (Sandbox Code Playgroud)
它会生成预期的错误:
11 | f1( my_string );
| --------- value moved here
12 | f2( my_string );
| ^^^^^^^^^ value used here after move
Run Code Online (Sandbox Code Playgroud)
但是,如果您使用my_string该to_string()方法,程序将编译并运行。to_string()应该是一个无操作方法,因为已经my_string是String。然而,这个程序运行良好。
fn f1( string: String) {
println!("{}", string );
}
fn f2( string: …Run Code Online (Sandbox Code Playgroud) 我有一个 Windows 应用程序,带有用 Rust 和 winapi 编写的 GUI。尽管有 GUI,但它的行为就像控制台应用程序。当exe文件启动时,Command Prompt会弹出一个窗口,并从中运行应用程序。这不是我想要的;应该打开一个主窗口,就像在所有真正的桌面应用程序中一样。我如何使用 winapi 在 Rust 中实现这个目标?
我研究了一些选择。您可以使用Tauri或gtk-rs开发 Windows 桌面应用程序,但这两种技术在用于 Windows 应用程序时都有缺点。可以在这里找到更多选项。我还尝试了互联网上提供的windows-rs 示例,但它们都是带有图形用户界面的控制台应用程序,这不是我想要的。
我还注意到,C++ 桌面应用程序使用该函数int APIENTRY wWinMain(...)作为入口点,而控制台应用程序使用int main(...), 并且wWinMain在 rust winapi 中似乎不可用。
我正在尝试通过智能克隆和借用来优化应用程序,并且我正在观察以下行为。下面的程序将无法运行:
fn f( string: String) {
println!("{}", string );
}
fn main() {
let my_string: String = "ABCDE".to_string();
f( my_string );
f( my_string );
}
Run Code Online (Sandbox Code Playgroud)
它会生成众所周知的“移动后使用”错误。
fn f( string: String) {
println!("{}", string );
}
fn main() {
let my_string: String = "ABCDE".to_string();
f( my_string );
f( my_string );
}
Run Code Online (Sandbox Code Playgroud)
这个可以通过克隆来解决my_string。下面的程序运行良好:
fn f( string: String) {
println!("{}", string );
}
fn main() {
let my_string: String = "ABCDE".to_string();
f( my_string.clone() );
f( my_string.clone() );
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您在多线程环境中使用相同的方法,克隆就不再有帮助了。当函数调用嵌入到线程中时: …
struct在 Rust 桌面应用程序中,总是使用某些版本的窗口,例如WNDCLASSW. WNDCLASSW定义后,可以通过成员添加类图标。下面的代码摘录演示了如何包含存储在文件中的图标。structhIconIcon.ico
...
let hicon: HICON = LoadImageW(
0 as HINSTANCE,
wide_null("Icon.ico").as_ptr(),
IMAGE_ICON, 0, 0, LR_LOADFROMFILE
) as HICON;
let hinstance = GetModuleHandleW(null_mut());
let mut wc: WNDCLASSW = std::mem::zeroed();
wc.lpfnWndProc = Some(window_proc);
wc. hInstance = hinstance;
wc.hIcon = hicon;
wc.lpszClassName = name.as_ptr();
...
Run Code Online (Sandbox Code Playgroud)
图标文件在程序执行期间加载,并且必须与该exe文件保存在同一文件夹中。如果图标文件丢失,LoadImageW()则返回NULL句柄。设置hIcon为NULL有效并导致使用标准系统图标。
虽然此方法会生成所需的图标,但图标文件是在执行期间加载的,并且必须与文件一起传递exe。这不是一个可接受的解决方案;图标应链接到exe文件并在其中传递。
如何将图标链接到 Rust Windows 应用程序并在那里使用它?
我知道这个解决方案,但它在编译过程中会生成数千行错误和警告,并且必须被视为过时的。此解决方案有效,但它仅添加Windows 中显示的 …