问题 如何将c字符串转换为d字符串?


这很简单,我很尴尬地问,但是如何在D2中将c字符串转换为d字符串?

我有两个用例。

string convert( const(char)* c_str );
string convert( const(char)* c_str, size_t length );

5994
2018-03-24 13:51


起源



答案:


  1. 使用std.string.toString(char *)(D1 / Phobos)或std.conv.to!(string)(D2):

    // D1
    import std.string; 
    ... 
    string s = toString(c_str);
    
    // D2
    import std.conv;
    ...
    string s = to!(string)(c_str);
    
  2. 切指针:

    string s = c_str[0..len];
    

    (你不能使用“长度”,因为它与切片语法有特殊含义)。

两者都将在C字符串上返回一个切片(因此,引用而不是副本)。使用.dup属性创建副本。

请注意,D字符串被认为是UTF-8编码。如果你的字符串是另一种编码,你需要转换它(例如使用std.windows.charset中的函数)。


16
2018-03-24 14:00



toString 在D2中已弃用。 - kennytm
@Caspin:使用 to!string 要么 text 来自 std.conv 模块。 - kennytm
IIRC字符串是不可变的,所以对于情况2,你需要抛出一个演员表(如果你知道c-string是不可变的或者是 .idup 对于其他情况。 - BCS
@The Elite:是的,它确实如果你喜欢C ++,你应该看看D.(请注意,生态系统目前还有点不成熟)。 - BCS
@Cyber​​Shadow,D1没有提供足够的优势而不是c ++来引起我的兴趣。特别是D2的模板语法引起了我的兴趣,基于范围的容器而不是基于迭代器,并且...... - deft_code


答案:


  1. 使用std.string.toString(char *)(D1 / Phobos)或std.conv.to!(string)(D2):

    // D1
    import std.string; 
    ... 
    string s = toString(c_str);
    
    // D2
    import std.conv;
    ...
    string s = to!(string)(c_str);
    
  2. 切指针:

    string s = c_str[0..len];
    

    (你不能使用“长度”,因为它与切片语法有特殊含义)。

两者都将在C字符串上返回一个切片(因此,引用而不是副本)。使用.dup属性创建副本。

请注意,D字符串被认为是UTF-8编码。如果你的字符串是另一种编码,你需要转换它(例如使用std.windows.charset中的函数)。


16
2018-03-24 14:00



toString 在D2中已弃用。 - kennytm
@Caspin:使用 to!string 要么 text 来自 std.conv 模块。 - kennytm
IIRC字符串是不可变的,所以对于情况2,你需要抛出一个演员表(如果你知道c-string是不可变的或者是 .idup 对于其他情况。 - BCS
@The Elite:是的,它确实如果你喜欢C ++,你应该看看D.(请注意,生态系统目前还有点不成熟)。 - BCS
@Cyber​​Shadow,D1没有提供足够的优势而不是c ++来引起我的兴趣。特别是D2的模板语法引起了我的兴趣,基于范围的容器而不是基于迭代器,并且...... - deft_code