সি ++ (ইউনিকোড) এ কীভাবে std :: স্ট্রিংকে LPCWSTR এ রূপান্তর করবেন?


115

আমি std :: স্ট্রিংকে LPCWSTR এ রূপান্তর করার জন্য একটি পদ্ধতি বা একটি কোড স্নিপেট খুঁজছি


1
আমরা বিপরীতটি কীভাবে করব?
— সোহাইব

আমি গুগল থেকে এসেছি বিপরীতে করার চেষ্টা করে। আপনি কোন পদ্ধতি খুঁজে পান নি?
— টোমা জ্যাটো - মনিকা

উত্তর:


134

এমএসডিএন নিবন্ধটির লিঙ্কের জন্য ধন্যবাদ। আমি ঠিক এটিই খুঁজছিলাম।

std::wstring s2ws(const std::string& s)
{
    int len;
    int slength = (int)s.length() + 1;
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
    std::wstring r(buf);
    delete[] buf;
    return r;
}

std::wstring stemp = s2ws(myString);
LPCWSTR result = stemp.c_str();

4
(এ প্রশ্নটি এলোমেলোভাবে ব্রাউজ করে পাওয়া গেছে; আমি সি ++ করেছি তার পরে অনেক দিন হয়েছে)) সুতরাং স্ট্যান্ডার্ড লাইব্রেরিতে স্ট্যান্ড :: স্ট্রিং -> স্টাড :: wstring রূপান্তর নেই? অদ্ভুত বলে মনে হয়; একটি ভাল কারণ আছে?
— ডোমেনিক

5
আপনি যদি বুফের জন্য সঞ্চয়স্থান তৈরি করতে std :: vector <wchar_t> ব্যবহার করেন তবে কিছু যদি ব্যতিক্রম ছুঁড়ে ফেলে তবে আপনার অস্থায়ী বাফারটি মুক্তি পাবে।
— জেসন হ্যারিসন

81
কারণ # 233 কেন সি ++ আমাকে নরকে ছাড়িয়েছে .. সাধারণ স্ট্রিং রূপান্তরকরণের জন্য কোডের 10 লাইন = /
— b1nary.atr0phy

2
অথবা কেবল wstring ws (s.begin (), s.end ()) বলুন ...?
— সিজেব্রু

3
@ সিজেব্রু: প্রতিটি সমস্যার জন্য একটি সমাধান রয়েছে, যা পরিষ্কার, মার্জিত এবং ভুল। ইতিমধ্যে আপনার ইনপুটটি ASCII ( এএনএসআই নয় ) অক্ষর ধারণ করে on
— IInspectable

121

সমাধানটি অন্য যে কোনও প্রস্তাবের তুলনায় অনেক সহজ:

std::wstring stemp = std::wstring(s.begin(), s.end());
LPCWSTR sw = stemp.c_str();

সর্বোপরি, এটি প্ল্যাটফর্মটি স্বাধীন। এইচ 2 এইচ :)


2
দুঃখিত বেনি কিন্তু এটি আমার পক্ষে কাজ করে না, টোরানের নিজস্ব সমাধানটি যদিও (তবে..বলিগ!) ভাল কাজ করছে বলে মনে হচ্ছে।
— আইয়েন কলিন্স

32
এটি কেবলমাত্র যদি সমস্ত অক্ষর একক বাইট হয়, যেমন ASCII বা আইএসও -8859-1 হয় তবে এটি কাজ করে । মাল্টি-বাইটের যে কোনও কিছুই ইউটিএফ -8 সহ, খারাপভাবে ব্যর্থ হবে।
— মার্ক মুক্তি পেতে

আমি বিশ্বাস করি আপনি প্রথম লাইনটি এখানে সহজ করতে পারবেন: std :: wstring স্টেম্প (s.begin (), s.end ()); এটি একটি সম্ভাব্য অনুলিপি মুছে ফেলবে এবং আরও সহজ দেখবে; নোট করুন যে সংকলকটি কোনওভাবে অনুলিপিটিকে মুছে ফেলতে পারে তবে এটি এখনও সহজ চেহারা।
— কিট

13
প্রভু, সমস্ত উপকারের কি আছে? এই উত্তরটি কখনও কখনও একা কাকতালীয়ভাবে কাজ করে। এটি চরিত্রের এনকোডিংগুলিকে সম্পূর্ণ উপেক্ষা করে । আপনি কেবল একটি সংকীর্ণ চরিত্রকে প্রশস্ত করতে পারবেন না এবং আশা করছেন যে এটি যাদুকরভাবে একই কোড পয়েন্টটি উপস্থাপন করে একটি বিস্তৃত অক্ষরে রূপান্তরিত করবে। এটি a এর নৈতিক সমতুল্য reinterpret_cast। এই কোডটি কাজ করে না। ব্যবহার করবেন না. ।
— IInspectable

2
@ এনিক: উইন্ডোজে charসাধারণত একটি এএনএসআই হিসাবে এনকোড থাকে। এএনএসআই এনকোডিং সহ, 128 থেকে 255 পর্যন্ত মানগুলি বর্তমানে সক্রিয় কোড পৃষ্ঠা ব্যবহার করে ব্যাখ্যা করা হয়। এই মানগুলিকে একটি wchar_t(উইন্ডোজে ইউটিএফ -16 এনকোডিং) এ সরিয়ে নেওয়া পছন্দসই ফলাফল তৈরি করবে না। আপনি যদি সুনির্দিষ্ট হতে চান, তবে এটি হ'ল 50% ক্ষেত্রে কাজ করে। ডিবিসিএস চরিত্রের এনকোডিং অ্যাকাউন্টে নেওয়া, সেই শতাংশ আরও কমে যায়।
— IInspectable

9

আপনি যদি এটিএল / এমএফসি পরিবেশে থাকেন তবে আপনি এটিএল রূপান্তর ম্যাক্রো ব্যবহার করতে পারেন:

#include <atlbase.h>
#include <atlconv.h>

. . .

string myStr("My string");
CA2W unicodeStr(myStr);

তারপরে আপনি ইউনিকোডএসআরটি এলপিসিডব্লিউএসটি হিসাবে ব্যবহার করতে পারেন। ইউনিকোড স্ট্রিংয়ের জন্য মেমরিটি স্ট্যাকের উপর তৈরি করা হয় এবং পরে ইউনিকোডএসআরটি নির্বাহকের জন্য ডেস্ট্রাক্টর প্রকাশ করা হয়।


0

একটি std :: স্ট্রিং ব্যবহার না করে আপনি একটি std :: wstring ব্যবহার করতে পারেন।

সম্পাদনা: দুঃখিত, এটি আরও ব্যাখ্যামূলক নয়, তবে আমাকে চালাতে হবে।

Std :: wstring :: c_str () ব্যবহার করুন


9
প্রশ্ন: "আমার X থেকে Y তে রূপান্তর করা দরকার" " - এ: "এমন কোনও কাজের সন্ধান করুন, যেখানে তারা এক্সের পরিবর্তে এ ব্যবহার করছেন।" এটি অকেজো।
— IInspectable

সব গাছের জন্য বন দেখতে পাচ্ছ না? এটি দরকারী, যেমনটি আমি যা খুঁজছিলাম ঠিক
— চার্লি

-3
string  myMessage="helloworld";
int len;
int slength = (int)myMessage.length() + 1;
len = MultiByteToWideChar(CP_ACP, 0, myMessage.c_str(), slength, 0, 0); 
wchar_t* buf = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, myMessage.c_str(), slength, buf, len);
std::wstring r(buf);
 std::wstring stemp = r.C_str();
LPCWSTR result = stemp.c_str();

-3

LPCWSTR lpcwName = std :: wstring (strname.begin (), strname.end ())। C_str ()


2
এই সমাধানটি 9 বছর আগে শীর্ষ উত্তরগুলির মধ্যে একটি দ্বারা ইতিমধ্যে প্রস্তাব করা হয়েছিল
— নিনো ফিলিউ

1
9 বছর আগে এটি আজও ততটা ভুল। মন্তব্যগুলি ব্যাখ্যা করে, কেন এটি কেবল কোড ইউনিটের সংকীর্ণ পরিসরের জন্য কাজ করে।
— IINspectable
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.