The strange characters and plus symbol are URL encoding. It may not need that, so try removing it from the code:
$vars[] = 'L_NAME' . ($item_count+1) . '=' . (substr(strip_tags($cart->DisplayInfo("Name")), 0, 127));
$vars[] = 'L_SKU' . ($item_count+1) . '=' . (substr($cart->DisplayInfo("ID"), 0, 127));
$vars[] = 'L_DESC' . ($item_count+1) . '=' . (substr(strip_tags($cart->DisplayInfo("Description")), 0, 127));
$vars[] = 'L_COST' . ($item_count+1) . '=' . (number_format($cart->DisplayInfo("Price"), 2, '.', ''));
$vars[] = 'L_QTY' . ($item_count+1) . '=' . ($cart->DisplayInfo("Quantity"));
In terms of why it doesn't show the description or where it might, you would have to ask paypal. A possible solution would be to concatenate both into the name field and don't use the description.