আমি কীভাবে বেক্টরের কোনও ভেক্টরকে (u8) স্ট্রিংয়ে রূপান্তর করব


100

আমি মরিচায় সহজ টিসিপি / আইপি ক্লায়েন্ট লেখার চেষ্টা করছি এবং সার্ভার থেকে আমার পাওয়া বাফারটি মুদ্রণ করা দরকার।

আমি কীভাবে একটি Vec<u8>(বা ক &[u8]) এ রূপান্তর করব String?

উত্তর:


104

বাইটের স্লাইসটিকে স্ট্রিং স্লাইসে রূপান্তর করতে (একটি ইউটিএফ -8 এনকোডিং ধরে নিচ্ছেন):

use std::str;

//
// pub fn from_utf8(v: &[u8]) -> Result<&str, Utf8Error>
//
// Assuming buf: &[u8]
//

fn main() {

    let buf = &[0x41u8, 0x41u8, 0x42u8];

    let s = match str::from_utf8(buf) {
        Ok(v) => v,
        Err(e) => panic!("Invalid UTF-8 sequence: {}", e),
    };

    println!("result: {}", s);
}

রূপান্তরটি স্থানে রয়েছে এবং এর জন্য বরাদ্দ প্রয়োজন হয় না। Stringস্ট্রিং স্লাইসে ফোন .to_owned()করে প্রয়োজনে স্ট্রিং স্লাইস থেকে একটি তৈরি করতে পারেন ( অন্যান্য বিকল্প উপলব্ধ। )

রূপান্তর ফাংশনের জন্য লাইব্রেরি রেফারেন্স:


আপনি এটি যুক্ত করতে চাইতে পারেন কারণ ভিসি টুকরো টুকরো টুকরো করে
টর্কলি

যদিও উদাহরণ কোডটি আসলে কোনও ভেক্টর ব্যবহার করে না :-)
অ্যান্ড্রু ম্যাকেনজি

যদিও এটি সত্য যে from_utf8বরাদ্দ দেয় না, এটি উল্লেখ করা উচিত যে এটি utf-8 যথার্থতা যাচাই করতে ডেটা স্ক্যান করা প্রয়োজন। সুতরাং এটি কোনও ও (1) অপারেশন নয় (যা প্রথমে কেউ ভাবতে পারে)
জার্গনি

70

আমি পছন্দ করি String::from_utf8_lossy:

fn main() {
    let buf = &[0x41u8, 0x41u8, 0x42u8];
    let s = String::from_utf8_lossy(buf);
    println!("result: {}", s);
}

এটি অবৈধ ইউটিএফ -8 বাইটকে এ পরিণত করে এবং তাই কোনও ত্রুটি পরিচালনার প্রয়োজন হয় না। আপনার যখন প্রয়োজন হবে না তখন এটির জন্য ভাল এবং আমার খুব কমই দরকার। আপনি আসলে এটি Stringথেকে একটি পেতে । সার্ভার থেকে আপনি কী পান তা কিছুটা সহজ করে দেওয়া উচিত make

into_owned()এটি লেখার ক্লোন হওয়ার কারণে কখনও কখনও আপনার পদ্ধতিটি ব্যবহার করতে হতে পারে ।


4
into_owned()পরামর্শের জন্য অনেক ধন্যবাদ ! ঠিক আমি যা খুঁজছিলাম তা ছিল (এটি এটি একটি উপযুক্ত হয়ে ওঠে Stringযা আপনি কোনও পদ্ধতি থেকে রিটার্ন মান হিসাবে ফিরে আসতে পারেন)।
প্রতি লন্ডবার্গ

50

যদি আপনার কাছে বাইটস ( Vec<u8>) এর একটি ভেক্টর থাকে এবং এটিতে রূপান্তর করতে চান Stringতবে সবচেয়ে কার্যকর হ'ল বরাদ্দটি পুনরায় ব্যবহার করে String::from_utf8:

fn main() {
    let bytes = vec![0x41, 0x42, 0x43];
    let s = String::from_utf8(bytes).expect("Found invalid UTF-8");
    println!("{}", s);
}

4
ধন্যবাদ! অন্য দুটি উত্তর কেন প্রশ্নটিকে উপেক্ষা করেছে?
জাহান

4
@ জেহান কারণ মানুষ সাধারণত প্রশ্ন জিজ্ঞাসা করতে পারে না, বিশেষত যখন তারা কোনও ভাষায় নতুন হয়। মরিচ একটি অ্যারে , একটি স্লাইস এবং এ এর মধ্যে পার্থক্য তৈরি করে Vecতবে নতুনরা এই পার্থক্যগুলি জানেন না। যদিও কার্যকর প্রমাণিত সমস্ত প্রশ্ন এবং উত্তর upvote নিশ্চিত করুন।
শেপমাস্টার

নোট করুন যে @ জর্ন টিপলিং দ্বারা উল্লিখিত হিসাবে আপনি String::from_utf8_lossyপরিবর্তে এখানে ব্যবহার করতে পারেন , তারপরে আপনার প্রত্যাশিত কলটির প্রয়োজন হবে না।
জেমস রে

4
সম্পাদনা করুন: নোট করুন যে @ জর্ন টিপলিং দ্বারা উল্লিখিত হিসাবে আপনি সম্ভবত এটির String::from_utf8_lossyপরিবর্তে এখানে ব্যবহার করতে পারবেন বলে মনে করতে পারেন , তবে আপনার expectকলটির প্রয়োজন নেই , তবে এতে ইনপুটটি বাইটেসের টুকরো ( &'a [u8])। OTOH, এছাড়াও আছে from_utf8_unchecked। "আপনি কি নিশ্চিত যে বাইট ফালি বৈধ হল UTF-8 আছে, এবং আপনি রূপান্তর ওভারহেড বহন করতে চাই না, তাহলে এই ফাংশন একজন অনিরাপদ সংস্করণ [ from_utf8_lossy], from_utf8_uncheckedএকই আচরণ আছে কিন্তু চেক অগ্রাহ্য পারে। "
জেমস রে

নোট করুন যে আপনি &vec_of_bytesবাইটের স্লাইসে ফিরে রূপান্তর করতে ব্যবহার করতে পারেন , উদাহরণ হিসাবে তালিকাভুক্ত from_utf8_lossydoc.rust-lang.org/std/string/…
জেমস রে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.