Thay thế chuỗi trong C#

Chào các bạn! Mình đang code 1 ứng dụng chuyển mã font VNI sang unicode, Thuật toán là duyệt dòng chữ tiếng Việt, rồi thay thế các ký tự trong bảng mã VNI bằng các ký tự trong bảng mã Unicode tương ứng. Đến chỗ thay thế text thì bị lỗi (txt = txt.Replace(txt.Substring(i, 2), c2); Chuỗi đầu vào là 1 dòng chữ tiếng Việt
Chạy thử lỗi như sau:

Command: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.ArgumentOutOfRangeException: Index and length must refer to a location within the string.
Parameter name: length
   at System.String.Substring(Int32 startIndex, Int32 length)
   at CANHQUYVD11.ConcerterVNItoUnicode.ConvertVNIWindows(String txt)
   at CANHQUYVD11.ChangeFontCode.ChuyenMaText()
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at CadAddinManager.Command.AddinManagerBase.Invoke(MethodInfo methodInfo)
  • Các bạn xem giúp đoạn code dưới và cho mình ý kiến với, cảm ơn nhiều!
public class ConcerterVNItoUnicode
{
      public string ConvertVNIWindows(string txt)
    {
        int idx;
        string c="";
        string c2="";
        var _VniWindows2 = new List<string> {
            "aâ",                "AÂ",                "aê",                "AÊ",                "eâ",                "EÂ",                "ô", 
      // Xóa bớt cho gọn
        };
        var _VniWindows1 = new List<string> {
            "ñ",                "Ñ",                "í",                "Í",
            "ì",                "Ì",                "æ",                "Æ",
            "ö",                "Ö",                "î",                "Î"
        };
        var _Unicode2 = new List<string> {
            "â",                "Â",
            "ă",                "Ă",                "ê",                "Ê",                "ơ",                "Ơ",
        };
        var _Unicode1 = new List<string> {
            "đ",                "Đ",                "í",                "Í",                "ì",                "Ì",                "ỉ",                "Ỉ",
            "ư",                "Ư",                "ỵ",                "Ỵ"
        }; 
        int daiText = txt.Length;
        for(i = 0; i < daiText-1; i++)
        {
            c = txt.Substring(i, 2);
            
            if (_VniWindows2.Contains(c))
            {
                
                idx = _VniWindows2.IndexOf(c);
                if (idx >= 0)
                {
                   c2 = _Unicode2[idx];
                }
                txt = txt.Replace(txt.Substring(i, 2), c2);  //-----------LỖI CHỖ NÀY --------LỖI CHỖ NÀY--------LỖI CHỖ NÀY
                
            }
        }

        return txt;
    }

    
}

bị lỗi nhưng lỗi gì thì bạn không nói
bạn cũng không nói bạn đã nhập input gì
vậy mọi người chạy code và check lỗi bằng trí tưởng tượng sao

4 Likes

Mình đã bổ sung rồi, cảm ơn bạn :slight_smile:

Ngay khi đọc đến đây thì nghi ngờ đoạn này chính là lỗi bạn đang gặp phải, đọc tiếp thông báo lỗi thì đúng như vậy.

Biết vì sao mình nghi ngờ ngay khi đọc đến đó không? Vì bạn truyền 1 số cố định vào Substring.
Giờ thử với chuỗi có 10 kí tự (chỉ số từ 0 đến 9) và gọi Substring(9, 2) xem nó ra đúng lỗi đó không! Chắc chắn là vậy, vì từ chỉ số 9 lấy 2 kí tự tức lấy đến chỉ số 11, nhưng chuỗi chỉ đến chỉ số 9. Câu thông báo lỗi của bạn đã báo rõ rồi.

Còn một lý do nữa: nếu bạn chạy trong vòng lặp và thay đổi chiều dài của chuỗi, chỉ số hiện tại sẽ sai bét nếu độ dài của chuỗi bị thay và chuỗi thay khác nhau.

Nhưng sao bạn lại lấy 2 kí tự mỗi lần so sánh???

3 Likes

CHuẩn rồi, cảm ơn bạn!

làm sao chỉ thay thế chuổi có sẵng trong c# chỉ 1 lần thôi. ở 1 vị trí nào đó

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?